summaryrefslogtreecommitdiff
path: root/src/resolve.cc
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2015-02-13 18:36:08 -0500
committerAdrian Thurston <thurston@complang.org>2015-02-13 18:36:08 -0500
commit7971f22167db5f108430e4735e4cc1b492e6bd9d (patch)
tree3a8d0f36a13b7fab5c13c3c5d44dcff859da649d /src/resolve.cc
parentccf380421c08b6ec1f8b9c4ce6c62eb1fbf5e1e5 (diff)
downloadcolm-7971f22167db5f108430e4735e4cc1b492e6bd9d.tar.gz
work on value list and value map, can insert into vmap
Diffstat (limited to 'src/resolve.cc')
-rw-r--r--src/resolve.cc105
1 files changed, 105 insertions, 0 deletions
diff --git a/src/resolve.cc b/src/resolve.cc
index 19b4105a..0b2a4489 100644
--- a/src/resolve.cc
+++ b/src/resolve.cc
@@ -263,6 +263,105 @@ UniqueType *TypeRef::resolveTypeMapEl( Compiler *pd )
return pd->findUniqueType( TYPE_GENERIC, inMap->generic );
}
+UniqueType *TypeRef::resolveTypeValueList( Compiler *pd )
+{
+ nspace = pd->rootNamespace;
+
+ UniqueType *utValue = typeRef1->resolveType( pd );
+
+ if ( utValue->typeId != TYPE_STRUCT )
+ error( loc ) << "only structs can be list elements" << endp;
+
+ /* Find the offset of the list element. */
+ int off = 0;
+ ObjectField *listEl = 0;
+ FieldList *fieldList = utValue->structEl->structDef->objectDef->fieldList;
+ for ( FieldList::Iter f = *fieldList; f.lte(); f++, off++ ) {
+ if ( f->value->type == ObjectField::GenericElementType ) {
+ UniqueType *fUT = f->value->typeRef->resolveType( pd );
+ if ( fUT->typeId == TYPE_GENERIC && fUT->generic != 0 &&
+ fUT->generic->typeId == GEN_LIST_EL )
+ {
+ listEl = f->value;
+ break;
+ }
+ }
+ }
+
+ if ( !listEl )
+ error( loc ) << "could not find list element in type ref" << endp;
+
+ UniqueGeneric searchKey( UniqueGeneric::List, utValue );
+ UniqueGeneric *inMap = pd->uniqueGenericMap.find( &searchKey );
+ if ( inMap == 0 ) {
+ inMap = new UniqueGeneric( searchKey );
+ pd->uniqueGenericMap.insert( inMap );
+
+ GenericType *generic = new GenericType( GEN_VLIST,
+ pd->nextGenericId++, typeRef1 );
+ generic->el = listEl;
+
+ nspace->genericList.append( generic );
+
+ generic->declare( pd, nspace );
+
+ inMap->generic = generic;
+ }
+
+ generic = inMap->generic;
+ return pd->findUniqueType( TYPE_GENERIC, inMap->generic );
+}
+
+UniqueType *TypeRef::resolveTypeValueMap( Compiler *pd )
+{
+ nspace = pd->rootNamespace;
+
+ UniqueType *utKey = typeRef1->resolveType( pd );
+ UniqueType *utEl = typeRef2->resolveType( pd );
+ UniqueType *utValue = typeRef3->resolveType( pd );
+
+ if ( utEl->typeId != TYPE_STRUCT )
+ error( loc ) << "only structs can be map elements" << endp;
+
+ /* Find the list element. */
+ ObjectField *mapEl = 0;
+ FieldList *fieldList = utEl->structEl->structDef->objectDef->fieldList;
+ for ( FieldList::Iter f = *fieldList; f.lte(); f++ ) {
+ UniqueType *fUT = f->value->typeRef->resolveType( pd );
+ if ( fUT->typeId == TYPE_GENERIC && fUT->generic != 0 &&
+ fUT->generic->typeId == GEN_MAP_EL )
+ {
+ mapEl = f->value;
+ break;
+ }
+ }
+
+ if ( !mapEl )
+ error( loc ) << "could not find map element in type ref" << endp;
+
+ UniqueGeneric searchKey( UniqueGeneric::Map, utKey, utEl );
+ UniqueGeneric *inMap = pd->uniqueGenericMap.find( &searchKey );
+ if ( inMap == 0 ) {
+ inMap = new UniqueGeneric( searchKey );
+ pd->uniqueGenericMap.insert( inMap );
+
+ GenericType *generic = new GenericType( GEN_VMAP,
+ pd->nextGenericId++, typeRef2 );
+ generic->keyTypeArg = typeRef1;
+ generic->el = mapEl;
+ generic->valueUT = utValue;
+
+ nspace->genericList.append( generic );
+
+ generic->declare( pd, nspace );
+
+ inMap->generic = generic;
+ }
+
+ generic = inMap->generic;
+ return pd->findUniqueType( TYPE_GENERIC, inMap->generic );
+}
+
UniqueType *TypeRef::resolveTypeParser( Compiler *pd )
{
nspace = pd->rootNamespace;
@@ -404,6 +503,12 @@ UniqueType *TypeRef::resolveType( Compiler *pd )
case Iterator:
uniqueType = resolveIterator( pd );
break;
+ case ValueList:
+ uniqueType = resolveTypeValueList( pd );
+ break;
+ case ValueMap:
+ uniqueType = resolveTypeValueMap( pd );
+ break;
case Unspecified:
/* No lookup needed, unique type(s) set when constructed. */