# HG changeset patch # User Jarrett Billingsley # Date 1205506991 14400 # Node ID fd52beaaa94afdc0073712e9736fd7fdba449098 # Parent 09a64d96967a51420d50eadd598d40fbb1351569# Parent 1d06b4aed7cf9a684a0699fef17ec36e20726794 Merging changes from Aziz. diff -r 09a64d96967a -r fd52beaaa94a src/cmd/Compile.d --- a/src/cmd/Compile.d Fri Mar 14 11:01:05 2008 -0400 +++ b/src/cmd/Compile.d Fri Mar 14 11:03:11 2008 -0400 @@ -52,10 +52,10 @@ void printMTree(Package pckg, string indent) { Stdout(indent)(pckg.pckgName)("/").newline; - foreach (p; pckg.packages) + foreach (p; pckg.packages) // TODO: sort packages alphabetically by name? printMTree(p, indent ~ " "); - foreach (m; pckg.modules) - Stdout(indent ~ " ")(m.moduleName)(".d").newline; + foreach (m; pckg.modules) // TODO: sort modules alphabetically by name? + Stdout(indent ~ " ")(m.moduleName)(".")(m.fileExtension()).newline; } /// Runs the first pass on modul. diff -r 09a64d96967a -r fd52beaaa94a src/dil/lexer/IdTable.d --- a/src/dil/lexer/IdTable.d Fri Mar 14 11:01:05 2008 -0400 +++ b/src/dil/lexer/IdTable.d Fri Mar 14 11:03:11 2008 -0400 @@ -148,6 +148,24 @@ return genAnonymousID("__anonenum"); } + /// Generates an identifier for an anonymous class. + Identifier* genAnonClassID() + { + return genAnonymousID("__anonclass"); + } + + /// Generates an identifier for an anonymous struct. + Identifier* genAnonStructID() + { + return genAnonymousID("__anonstruct"); + } + + /// Generates an identifier for an anonymous union. + Identifier* genAnonUnionID() + { + return genAnonymousID("__anonunion"); + } + /// Generates an identifier for a module which has got no valid name. Identifier* genModuleID() { diff -r 09a64d96967a -r fd52beaaa94a src/dil/semantic/Pass1.d --- a/src/dil/semantic/Pass1.d Fri Mar 14 11:01:05 2008 -0400 +++ b/src/dil/semantic/Pass1.d Fri Mar 14 11:03:11 2008 -0400 @@ -87,6 +87,12 @@ } /// Inserts a symbol into the current scope. + void insert(Symbol symbol) + { + insert(symbol, symbol.name); + } + + /// Inserts a symbol into the current scope. void insert(Symbol symbol, Identifier* name) { auto symX = scop.symbol.lookup(name); @@ -111,8 +117,9 @@ } /// Inserts a symbol, overloading on the name, into the current scope. - void insertOverload(Symbol sym, Identifier* name) + void insertOverload(Symbol sym) { + auto name = sym.name; auto sym2 = scop.symbol.lookup(name); if (sym2) { @@ -224,21 +231,30 @@ D visit(EnumDeclaration d) { + if (d.symbol) + return d; + // Create the symbol. d.symbol = new Enum(d.name, d); - auto isAnonymous = d.name is null; + + bool isAnonymous = d.symbol.isAnonymous; if (isAnonymous) d.symbol.name = IdTable.genAnonEnumID(); - insert(d.symbol, d.symbol.name); + + insert(d.symbol); + auto parentScopeSymbol = scop.symbol; + auto enumSymbol = d.symbol; enterScope(d.symbol); // Declare members. foreach (member; d.members) { visitD(member); + if (isAnonymous) // Also insert into parent scope if enum is anonymous. insert(member.symbol, parentScopeSymbol); - member.symbol.parent = d.symbol; + + member.symbol.type = enumSymbol.type; // Assign TypeEnum. } exitScope(); return d; @@ -247,7 +263,7 @@ D visit(EnumMemberDeclaration d) { d.symbol = new EnumMember(d.name, protection, storageClass, linkageType, d); - insert(d.symbol, d.symbol.name); + insert(d.symbol); return d; } @@ -255,9 +271,10 @@ { if (d.symbol) return d; + // Create the symbol. d.symbol = new Class(d.name, d); // Insert into current scope. - insert(d.symbol, d.name); + insert(d.symbol); enterScope(d.symbol); // Continue semantic analysis. d.decls && visitD(d.decls); @@ -269,12 +286,13 @@ { if (d.symbol) return d; + // Create the symbol. d.symbol = new dil.semantic.Symbols.Interface(d.name, d); // Insert into current scope. - insert(d.symbol, d.name); + insert(d.symbol); enterScope(d.symbol); - // Continue semantic analysis. - d.decls && visitD(d.decls); + // Continue semantic analysis. + d.decls && visitD(d.decls); exitScope(); return d; } @@ -283,14 +301,23 @@ { if (d.symbol) return d; + // Create the symbol. d.symbol = new Struct(d.name, d); + + if (d.symbol.isAnonymous) + d.symbol.name = IdTable.genAnonStructID(); // Insert into current scope. - if (d.name) - insert(d.symbol, d.name); + insert(d.symbol); + enterScope(d.symbol); - // Continue semantic analysis. - d.decls && visitD(d.decls); + // Continue semantic analysis. + d.decls && visitD(d.decls); exitScope(); + + if (d.symbol.isAnonymous) + // Insert members into parent scope as well. + foreach (member; d.symbol.members) + insert(member); return d; } @@ -298,49 +325,59 @@ { if (d.symbol) return d; + // Create the symbol. d.symbol = new Union(d.name, d); + + if (d.symbol.isAnonymous) + d.symbol.name = IdTable.genAnonUnionID(); + // Insert into current scope. - if (d.name) - insert(d.symbol, d.name); + insert(d.symbol); + enterScope(d.symbol); - // Continue semantic analysis. - d.decls && visitD(d.decls); + // Continue semantic analysis. + d.decls && visitD(d.decls); exitScope(); + + if (d.symbol.isAnonymous) + // Insert members into parent scope as well. + foreach (member; d.symbol.members) + insert(member); return d; } D visit(ConstructorDeclaration d) { auto func = new Function(Ident.__ctor, d); - insertOverload(func, func.name); + insertOverload(func); return d; } D visit(StaticConstructorDeclaration d) { auto func = new Function(Ident.__ctor, d); - insertOverload(func, func.name); + insertOverload(func); return d; } D visit(DestructorDeclaration d) { auto func = new Function(Ident.__dtor, d); - insertOverload(func, func.name); + insertOverload(func); return d; } D visit(StaticDestructorDeclaration d) { auto func = new Function(Ident.__dtor, d); - insertOverload(func, func.name); + insertOverload(func); return d; } D visit(FunctionDeclaration d) { auto func = new Function(d.name, d); - insertOverload(func, func.name); + insertOverload(func); return d; } @@ -356,7 +393,7 @@ auto variable = new Variable(name, protection, storageClass, linkageType, vd); variable.value = vd.inits[i]; vd.variables ~= variable; - insert(variable, name); + insert(variable); } return vd; } @@ -364,21 +401,21 @@ D visit(InvariantDeclaration d) { auto func = new Function(Ident.__invariant, d); - insert(func, func.name); + insert(func); return d; } D visit(UnittestDeclaration d) { auto func = new Function(Ident.__unittest, d); - insertOverload(func, func.name); + insertOverload(func); return d; } D visit(DebugDeclaration d) { if (d.isSpecification) - { + { // debug = Id|Int if (!isModuleScope()) error(d.begin, MSG.DebugSpecModuleLevel, d.spec.srcText); else if (d.spec.kind == TOK.Identifier) @@ -400,7 +437,7 @@ D visit(VersionDeclaration d) { if (d.isSpecification) - { + { // version = Id|Int if (!isModuleScope()) error(d.begin, MSG.VersionSpecModuleLevel, d.spec.srcText); else if (d.spec.kind == TOK.Identifier) @@ -423,27 +460,24 @@ { if (d.symbol) return d; + // Create the symbol. d.symbol = new Template(d.name, d); // Insert into current scope. - insertOverload(d.symbol, d.name); - enterScope(d.symbol); - // Continue semantic analysis. - visitD(d.decls); - exitScope(); + insertOverload(d.symbol); return d; } D visit(NewDeclaration d) { auto func = new Function(Ident.__new, d); - insert(func, func.name); + insert(func); return d; } D visit(DeleteDeclaration d) { auto func = new Function(Ident.__delete, d); - insert(func, func.name); + insert(func); return d; } diff -r 09a64d96967a -r fd52beaaa94a src/dil/semantic/Pass2.d --- a/src/dil/semantic/Pass2.d Fri Mar 14 11:01:05 2008 -0400 +++ b/src/dil/semantic/Pass2.d Fri Mar 14 11:03:11 2008 -0400 @@ -134,7 +134,10 @@ Type type = Types.Int; // Default to int. if (d.baseType) type = visitT(d.baseType).type; - d.symbol.type = new TypeEnum(d.symbol, type); + // Set the enum's base type. + d.symbol.type.baseType = type; + + // TODO: check base type. must be basic type or another enum. enterScope(d.symbol); @@ -151,7 +154,6 @@ } //else // TODO: increment a number variable and assign that to value. - member.symbol.type = d.symbol.type; // Assign TypeEnum. member.symbol.value = finalValue; member.symbol.setComplete(); } diff -r 09a64d96967a -r fd52beaaa94a src/dil/semantic/Symbols.d --- a/src/dil/semantic/Symbols.d Fri Mar 14 11:01:05 2008 -0400 +++ b/src/dil/semantic/Symbols.d Fri Mar 14 11:03:11 2008 -0400 @@ -48,6 +48,7 @@ /// Aggregates have function and field members. abstract class Aggregate : ScopeSymbol { + Type type; Function[] funcs; Variable[] fields; @@ -74,6 +75,7 @@ this(Identifier* name, Node classNode) { super(SYM.Class, name, classNode); + this.type = new TypeClass(this); } } @@ -83,24 +85,31 @@ this(Identifier* name, Node interfaceNode) { super(SYM.Interface, name, interfaceNode); + this.type = new TypeClass(this); + } +} + +/// A struct symbol. +class Struct : Aggregate +{ + bool isAnonymous; + this(Identifier* name, Node structNode) + { + super(SYM.Struct, name, structNode); + this.type = new TypeStruct(this); + this.isAnonymous = name is null; } } /// A union symbol. class Union : Aggregate { + bool isAnonymous; this(Identifier* name, Node unionNode) { super(SYM.Union, name, unionNode); - } -} - -/// A struct symbol. -class Struct : Aggregate -{ - this(Identifier* name, Node structNode) - { - super(SYM.Struct, name, structNode); + this.type = new TypeStruct(this); + this.isAnonymous = name is null; } } @@ -108,9 +117,12 @@ class Enum : ScopeSymbol { TypeEnum type; + bool isAnonymous; this(Identifier* name, Node enumNode) { super(SYM.Enum, name, enumNode); + this.type = new TypeEnum(this); + this.isAnonymous = name is null; } void setType(TypeEnum type) diff -r 09a64d96967a -r fd52beaaa94a src/dil/semantic/Types.d --- a/src/dil/semantic/Types.d Fri Mar 14 11:01:05 2008 -0400 +++ b/src/dil/semantic/Types.d Fri Mar 14 11:03:11 2008 -0400 @@ -130,12 +130,19 @@ /// Enum type. class TypeEnum : Type { - this(Symbol symbol, Type baseType) + this(Symbol symbol) { super(baseType, TYP.Enum); this.symbol = symbol; } + /// Setter for the base type. + void baseType(Type type) + { + next = type; + } + + /// Getter for the base type. Type baseType() { return next;