diff options
author | Adrian Thurston <thurston@complang.org> | 2015-06-07 15:35:02 -0400 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2015-06-07 15:35:02 -0400 |
commit | 9ed46192f42837b4c066b5e1ebf859c9f5070106 (patch) | |
tree | a6b04026c8a95a344fae7abe96058666d2a9397e /src/resolve.cc | |
parent | c158a685a7bad2c4d06b4c160704b6913f5e70bf (diff) | |
download | colm-9ed46192f42837b4c066b5e1ebf859c9f5070106.tar.gz |
now creating list and map el structures in the declare pass
Diffstat (limited to 'src/resolve.cc')
-rw-r--r-- | src/resolve.cc | 146 |
1 files changed, 139 insertions, 7 deletions
diff --git a/src/resolve.cc b/src/resolve.cc index 947231e2..94bc76c3 100644 --- a/src/resolve.cc +++ b/src/resolve.cc @@ -189,6 +189,65 @@ UniqueType *TypeRef::resolveTypeListPtrs( Compiler *pd ) return pd->findUniqueType( TYPE_GENERIC, inMap->generic ); } +UniqueType *TypeRef::resolveTypeListEl( Compiler *pd ) +{ + UniqueType *utValue = typeRef1->resolveType( pd ); + + UniqueGeneric searchKey( UniqueGeneric::ListEl, utValue ); + UniqueGeneric *inMap = pd->uniqueGenericMap.find( &searchKey ); + if ( inMap == 0 ) { + inMap = new UniqueGeneric( searchKey ); + pd->uniqueGenericMap.insert( inMap ); + + static long vlistElId = 1; + String name( 32, "vlist_el_%d", vlistElId++ ); + ObjectDef *objectDef = ObjectDef::cons( ObjectDef::StructType, + name, pd->nextObjectId++ ); + + StructDef *structDef = new StructDef( loc, name, objectDef ); + + pd->rootNamespace->structDefList.append( structDef ); + + /* Make the new namespace. */ + Namespace *nspace = new Namespace( loc, name, + pd->namespaceList.length(), pd->rootNamespace ); + + pd->rootNamespace->childNamespaces.append( nspace ); + + pd->namespaceList.append( nspace ); + + + /* Value Element. */ + String id = "value"; + ObjectField *elValObjField = ObjectField::cons( internal, + ObjectField::StructFieldType, typeRef1, id ); + + elValObjField->context = structDef; + objectDef->rootScope->insertField( elValObjField->name, elValObjField ); + + elValObjField->context->listEl = true; + + /* List element with the same name as containing context. */ + NamespaceQual *nspaceQual = NamespaceQual::cons( nspace ); + TypeRef *objTr = TypeRef::cons( InputLoc(), nspaceQual, name, RepeatNone ); + TypeRef *elTr = TypeRef::cons( InputLoc(), TypeRef::ListPtrs, 0, objTr, 0 ); + + ObjectField *of = ObjectField::cons( InputLoc(), + ObjectField::GenericElementType, elTr, name ); + + of->context = structDef; + objectDef->rootScope->insertField( of->name, of ); + + /* Note this is recurse, all of above must complete. */ + //structDef->declare( pd, nspace ); + + StructEl *sel = declareStruct( pd, pd->rootNamespace, name, structDef ); + inMap->structEl = sel; + } + + return pd->findUniqueType( TYPE_STRUCT, inMap->structEl ); +} + UniqueType *TypeRef::resolveTypeMapPtrs( Compiler *pd ) { nspace = pd->rootNamespace; @@ -215,6 +274,70 @@ UniqueType *TypeRef::resolveTypeMapPtrs( Compiler *pd ) return pd->findUniqueType( TYPE_GENERIC, inMap->generic ); } +UniqueType *TypeRef::resolveTypeMapEl( Compiler *pd ) +{ + TypeRef *keyType = typeRef1; + TypeRef *valType = typeRef2; + + UniqueType *utKey = keyType->resolveType( pd ); + UniqueType *utValue = valType->resolveType( pd ); + + UniqueGeneric searchKey( UniqueGeneric::MapEl, utKey, utValue ); + UniqueGeneric *inMap = pd->uniqueGenericMap.find( &searchKey ); + if ( inMap == 0 ) { + inMap = new UniqueGeneric( searchKey ); + pd->uniqueGenericMap.insert( inMap ); + + static long vlistElId = 1; + String name( 32, "map_el_%d", vlistElId++ ); + ObjectDef *objectDef = ObjectDef::cons( ObjectDef::StructType, + name, pd->nextObjectId++ ); + + StructDef *structDef = new StructDef( loc, name, objectDef ); + + pd->rootNamespace->structDefList.append( structDef ); + + /* Make the new namespace. */ + Namespace *nspace = new Namespace( loc, name, + pd->namespaceList.length(), pd->rootNamespace ); + + pd->rootNamespace->childNamespaces.append( nspace ); + + pd->namespaceList.append( nspace ); + + + /* Value Element. */ + String id = "value"; + ObjectField *elValObjField = ObjectField::cons( internal, + ObjectField::StructFieldType, valType, id ); + + elValObjField->context = structDef; + objectDef->rootScope->insertField( elValObjField->name, elValObjField ); + + elValObjField->context->mapEl = true; + + /* List element with the same name as containing context. */ + NamespaceQual *nspaceQual = NamespaceQual::cons( nspace ); + TypeRef *objTr = TypeRef::cons( InputLoc(), nspaceQual, name, RepeatNone ); + TypeRef *elTr = TypeRef::cons( InputLoc(), TypeRef::MapPtrs, 0, objTr, keyType ); + + ObjectField *of = ObjectField::cons( InputLoc(), + ObjectField::GenericElementType, elTr, name ); + + of->context = structDef; + objectDef->rootScope->insertField( of->name, of ); + + /* Note this is recurse, all of above must complete. */ + //structDef->declare( pd, nspace ); + + StructEl *sel = declareStruct( pd, pd->rootNamespace, name, structDef ); + inMap->structEl = sel; + } + + return pd->findUniqueType( TYPE_STRUCT, inMap->structEl ); +} + + UniqueType *TypeRef::resolveTypeMap( Compiler *pd ) { nspace = pd->rootNamespace; @@ -381,12 +504,6 @@ UniqueType *TypeRef::resolveType( Compiler *pd ) case Literal: uniqueType = resolveTypeLiteral( pd ); break; - case ListPtrs: - uniqueType = resolveTypeListPtrs( pd ); - break; - case MapPtrs: - uniqueType = resolveTypeMapPtrs( pd ); - break; case Parser: uniqueType = resolveTypeParser( pd ); break; @@ -396,12 +513,26 @@ UniqueType *TypeRef::resolveType( Compiler *pd ) case Iterator: uniqueType = resolveIterator( pd ); break; + case List: uniqueType = resolveTypeList( pd ); break; + case ListPtrs: + uniqueType = resolveTypeListPtrs( pd ); + break; + case ListEl: + uniqueType = resolveTypeListEl( pd ); + break; + case Map: uniqueType = resolveTypeMap( pd ); break; + case MapPtrs: + uniqueType = resolveTypeMapPtrs( pd ); + break; + case MapEl: + uniqueType = resolveTypeMapEl( pd ); + break; case Unspecified: /* No lookup needed, unique type(s) set when constructed. */ @@ -859,7 +990,8 @@ void Compiler::resolvePass() resolveParseTree(); - argvTypeRef->resolveType( this ); + UniqueType *argvUT = argvTypeRef->resolveType( this ); + argvElSel = argvUT->generic->elUt->structEl; /* We must do this as the last step in the type resolution process because * all type resolves can cause new language elments with associated |