Mercurial > projects > dil
changeset 585:05c375fb2d5c
Moved dil.Declarations to dil.ast.Declarations.
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Sat, 05 Jan 2008 23:01:42 +0100 |
parents | 556bfb18dff8 |
children | e25345656d10 |
files | trunk/src/cmd/ImportGraph.d trunk/src/dil/Declarations.d trunk/src/dil/Expressions.d trunk/src/dil/Module.d trunk/src/dil/SettingsLoader.d trunk/src/dil/Statements.d trunk/src/dil/ast/Declarations.d trunk/src/dil/parser/ImportParser.d trunk/src/dil/parser/Parser.d trunk/src/main.d |
diffstat | 10 files changed, 790 insertions(+), 790 deletions(-) [+] |
line wrap: on
line diff
--- a/trunk/src/cmd/ImportGraph.d Sat Jan 05 22:50:09 2008 +0100 +++ b/trunk/src/cmd/ImportGraph.d Sat Jan 05 23:01:42 2008 +0100 @@ -5,7 +5,7 @@ module cmd.ImportGraph; import dil.ast.Node; -import dil.Declarations; +import dil.ast.Declarations; import dil.Token; import dil.File; import dil.Module;
--- a/trunk/src/dil/Declarations.d Sat Jan 05 22:50:09 2008 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,782 +0,0 @@ -/++ - Author: Aziz Köksal - License: GPL3 -+/ -module dil.Declarations; - -import dil.ast.Node; -import dil.Expressions; -import dil.Types; -import dil.Statements; -import dil.Token; -import dil.Enums; -import dil.Scope; -import dil.IdTable; -import dil.semantic.Analysis; -import dil.Symbols; -import dil.semantic.Types; -import dil.Messages; -import common; - -abstract class Declaration : Node -{ - bool hasBody; - this() - { - super(NodeCategory.Declaration); - } - - // Members relevant to semantic phase. - StorageClass stc; /// The storage class of this declaration. - Protection prot; /// The protection attribute of this declaration. - - void semantic(Scope sc) - { - foreach (node; this.children) - { - assert(node !is null); - if (node.category == NodeCategory.Declaration) - (cast(Declaration)cast(void*)node).semantic(sc); - } - } - - final bool isStatic() - { - return !!(stc & StorageClass.Static); - } - - final bool isPublic() - { - return !!(prot & Protection.Public); - } - - final void setStorageClass(StorageClass stc) - { - this.stc = stc; - } - - final void setProtection(Protection prot) - { - this.prot = prot; - } - -} - -class Declarations : Declaration -{ - this() - { - hasBody = true; - mixin(set_kind); - } - - void opCatAssign(Declaration d) - { - addChild(d); - } - - void opCatAssign(Declarations ds) - { - addChildren(ds.children); - } - - override void semantic(Scope scop) - { - foreach (node; this.children) - { - assert(node.category == NodeCategory.Declaration); - (cast(Declaration)cast(void*)node).semantic(scop); - } - } -} - -/// Single semicolon. -class EmptyDeclaration : Declaration -{ - this() - { - mixin(set_kind); - } - - override void semantic(Scope) - {} -} - -/++ - Illegal declarations encompass all tokens that don't - start a DeclarationDefinition. - See_Also: dil.Token.isDeclDefStartToken() -+/ -class IllegalDeclaration : Declaration -{ - this() - { - mixin(set_kind); - } - - override void semantic(Scope) - {} -} - -/// FQN = fully qualified name -alias Identifier*[] ModuleFQN; // Identifier(.Identifier)* - -class ModuleDeclaration : Declaration -{ - Identifier* moduleName; - Identifier*[] packages; - this(ModuleFQN moduleFQN) - { - mixin(set_kind); - assert(moduleFQN.length != 0); - this.moduleName = moduleFQN[$-1]; - this.packages = moduleFQN[0..$-1]; - } - - char[] getFQN() - { - auto pname = getPackageName('.'); - if (pname.length) - return pname ~ "." ~ getName(); - else - return getName(); - } - - char[] getName() - { - if (moduleName) - return moduleName.str; - return null; - } - - char[] getPackageName(char separator) - { - char[] pname; - foreach (pckg; packages) - if (pckg) - pname ~= pckg.str ~ separator; - if (pname.length) - pname = pname[0..$-1]; // Remove last separator - return pname; - } -} - -class ImportDeclaration : Declaration -{ - private alias Identifier*[] Ids; - ModuleFQN[] moduleFQNs; - Ids moduleAliases; - Ids bindNames; - Ids bindAliases; - - this(ModuleFQN[] moduleFQNs, Ids moduleAliases, Ids bindNames, Ids bindAliases, bool isStatic) - { - mixin(set_kind); - this.moduleFQNs = moduleFQNs; - this.moduleAliases = moduleAliases; - this.bindNames = bindNames; - this.bindAliases = bindAliases; - if (isStatic) - this.stc |= StorageClass.Static; - } - - char[][] getModuleFQNs(char separator) - { - char[][] FQNs; - foreach (moduleFQN; moduleFQNs) - { - char[] FQN; - foreach (ident; moduleFQN) - if (ident) - FQN ~= ident.str ~ separator; - FQNs ~= FQN[0..$-1]; // Remove last separator - } - return FQNs; - } -} - -class AliasDeclaration : Declaration -{ - Declaration decl; - this(Declaration decl) - { - mixin(set_kind); - addChild(decl); - this.decl = decl; - } -} - -class TypedefDeclaration : Declaration -{ - Declaration decl; - this(Declaration decl) - { - mixin(set_kind); - addChild(decl); - this.decl = decl; - } -} - -class EnumDeclaration : Declaration -{ - Identifier* name; - TypeNode baseType; - EnumMember[] members; - this(Identifier* name, TypeNode baseType, EnumMember[] members, bool hasBody) - { - super.hasBody = hasBody; - mixin(set_kind); - addOptChild(baseType); - addOptChildren(members); - - this.name = name; - this.baseType = baseType; - this.members = members; - } -} - -class EnumMember : Node -{ - Identifier* name; - Expression value; - this(Identifier* name, Expression value) - { - super(NodeCategory.Other); - mixin(set_kind); - addOptChild(value); - - this.name = name; - this.value = value; - } -} - -abstract class AggregateDeclaration : Declaration -{ - Identifier* name; - TemplateParameters tparams; - Declarations decls; - this(Identifier* name, TemplateParameters tparams, Declarations decls) - { - super.hasBody = decls !is null; - this.name = name; - this.tparams = tparams; - this.decls = decls; - } -} - -class ClassDeclaration : AggregateDeclaration -{ - BaseClass[] bases; - this(Identifier* name, TemplateParameters tparams, BaseClass[] bases, Declarations decls) - { - super(name, tparams, decls); - mixin(set_kind); - addOptChild(tparams); - addOptChildren(bases); - addOptChild(decls); - - this.bases = bases; - } - - Class class_; /// The class symbol for this declaration. - - override void semantic(Scope scop) - { - if (class_) - return; - class_ = new Class(name, this); - // Create a new scope. - scop = scop.push(class_); - // Continue semantic analysis. - decls && decls.semantic(scop); - scop.pop(); - } -} - -class InterfaceDeclaration : AggregateDeclaration -{ - BaseClass[] bases; - this(Identifier* name, TemplateParameters tparams, BaseClass[] bases, Declarations decls) - { - super(name, tparams, decls); - mixin(set_kind); - addOptChild(tparams); - addOptChildren(bases); - addOptChild(decls); - - this.bases = bases; - } - - alias dil.Symbols.Interface InterfaceSymbol; - - InterfaceSymbol interface_; /// The interface symbol for this declaration. - - override void semantic(Scope scop) - { - if (interface_) - return; - interface_ = new InterfaceSymbol(name, this); - // Create a new scope. - scop = scop.push(interface_); - // Continue semantic analysis. - decls && decls.semantic(scop); - scop.pop(); - } -} - -class StructDeclaration : AggregateDeclaration -{ - uint alignSize; - this(Identifier* name, TemplateParameters tparams, Declarations decls) - { - super(name, tparams, decls); - mixin(set_kind); - addOptChild(tparams); - addOptChild(decls); - } - - void setAlignSize(uint alignSize) - { - this.alignSize = alignSize; - } - - Struct struct_; /// The struct symbol for this declaration. - - override void semantic(Scope scop) - { - if (struct_) - return; - struct_ = new Struct(name, this); - // Create a new scope. - scop = scop.push(struct_); - // Continue semantic analysis. - decls && decls.semantic(scop); - scop.pop(); - } -} - -class UnionDeclaration : AggregateDeclaration -{ - this(Identifier* name, TemplateParameters tparams, Declarations decls) - { - super(name, tparams, decls); - mixin(set_kind); - addOptChild(tparams); - addOptChild(decls); - } - - Union union_; /// The union symbol for this declaration. - - override void semantic(Scope scop) - { - if (union_) - return; - union_ = new Union(name, this); - // Create a new scope. - scop = scop.push(union_); - // Continue semantic analysis. - decls && decls.semantic(scop); - scop.pop(); - } -} - -class ConstructorDeclaration : Declaration -{ - Parameters parameters; - FunctionBody funcBody; - this(Parameters parameters, FunctionBody funcBody) - { - super.hasBody = true; - mixin(set_kind); - addChild(parameters); - addChild(funcBody); - - this.parameters = parameters; - this.funcBody = funcBody; - } -} - -class StaticConstructorDeclaration : Declaration -{ - FunctionBody funcBody; - this(FunctionBody funcBody) - { - super.hasBody = true; - mixin(set_kind); - addChild(funcBody); - - this.funcBody = funcBody; - } -} - -class DestructorDeclaration : Declaration -{ - FunctionBody funcBody; - this(FunctionBody funcBody) - { - super.hasBody = true; - mixin(set_kind); - addChild(funcBody); - - this.funcBody = funcBody; - } -} - -class StaticDestructorDeclaration : Declaration -{ - FunctionBody funcBody; - this(FunctionBody funcBody) - { - super.hasBody = true; - mixin(set_kind); - addChild(funcBody); - - this.funcBody = funcBody; - } -} - -class FunctionDeclaration : Declaration -{ - TypeNode returnType; - Identifier* funcName; - TemplateParameters tparams; - Parameters params; - FunctionBody funcBody; - LinkageType linkageType; - this(TypeNode returnType, Identifier* funcName, TemplateParameters tparams, - Parameters params, FunctionBody funcBody) - { - super.hasBody = funcBody.funcBody !is null; - mixin(set_kind); - addChild(returnType); - addOptChild(tparams); - addChild(params); - addChild(funcBody); - - this.returnType = returnType; - this.funcName = funcName; - this.tparams = tparams; - this.params = params; - this.funcBody = funcBody; - } - - void setLinkageType(LinkageType linkageType) - { - this.linkageType = linkageType; - } -} - -class VariableDeclaration : Declaration -{ - TypeNode typeNode; - Identifier*[] idents; - Expression[] values; - LinkageType linkageType; - this(TypeNode typeNode, Identifier*[] idents, Expression[] values) - { - // No empty arrays allowed. Both arrays must be of same size. - assert(idents.length != 0 && idents.length == values.length); - // If no type (in case of AutoDeclaration), first value mustn't be null. - assert(typeNode ? 1 : values[0] !is null); - mixin(set_kind); - addOptChild(typeNode); - foreach(value; values) - addOptChild(value); - - this.typeNode = typeNode; - this.idents = idents; - this.values = values; - } - - void setLinkageType(LinkageType linkageType) - { - this.linkageType = linkageType; - } - - Variable[] variables; - - override void semantic(Scope scop) - { - Type type; - - if (typeNode) - // Get type from typeNode. - type = typeNode.semantic(scop); - else - { // Infer type from first initializer. - auto firstValue = values[0]; - firstValue = firstValue.semantic(scop); - type = firstValue.type; - } - assert(type !is null); - - // Check for interface. - if (scop.isInterface) - return scop.error(begin, MSG.InterfaceCantHaveVariables); - - // Iterate over variable identifiers in this declaration. - foreach (i, ident; idents) - { - // Perform semantic analysis on value. - if (values[i]) - values[i] = values[i].semantic(scop); - // Create a new variable symbol. - auto variable = new Variable(stc, linkageType, type, ident, this); - variables ~= variable; - // Add to scope. - scop.insert(variable); - } - } -} - -class InvariantDeclaration : Declaration -{ - FunctionBody funcBody; - this(FunctionBody funcBody) - { - super.hasBody = true; - mixin(set_kind); - addChild(funcBody); - - this.funcBody = funcBody; - } -} - -class UnittestDeclaration : Declaration -{ - FunctionBody funcBody; - this(FunctionBody funcBody) - { - super.hasBody = true; - mixin(set_kind); - addChild(funcBody); - - this.funcBody = funcBody; - } -} - -abstract class ConditionalCompilationDeclaration : Declaration -{ - Token* spec; - Token* cond; - Declaration decls, elseDecls; - - this(Token* spec, Token* cond, Declaration decls, Declaration elseDecls) - { - super.hasBody = decls !is null; - addOptChild(decls); - addOptChild(elseDecls); - - this.spec = spec; - this.cond = cond; - this.decls = decls; - this.elseDecls = elseDecls; - } -} - -class DebugDeclaration : ConditionalCompilationDeclaration -{ - this(Token* spec, Token* cond, Declaration decls, Declaration elseDecls) - { - super(spec, cond, decls, elseDecls); - mixin(set_kind); - } -} - -class VersionDeclaration : ConditionalCompilationDeclaration -{ - this(Token* spec, Token* cond, Declaration decls, Declaration elseDecls) - { - super(spec, cond, decls, elseDecls); - mixin(set_kind); - } -} - -class StaticIfDeclaration : Declaration -{ - Expression condition; - Declaration ifDecls, elseDecls; - this(Expression condition, Declaration ifDecls, Declaration elseDecls) - { - super.hasBody = true; - mixin(set_kind); - addChild(condition); - addOptChild(ifDecls); - addOptChild(elseDecls); - - this.condition = condition; - this.ifDecls = ifDecls; - this.elseDecls = elseDecls; - } -} - -class StaticAssertDeclaration : Declaration -{ - Expression condition, message; - this(Expression condition, Expression message) - { - super.hasBody = true; - mixin(set_kind); - addChild(condition); - addOptChild(message); - - this.condition = condition; - this.message = message; - } -} - -class TemplateDeclaration : Declaration -{ - Identifier* name; - TemplateParameters tparams; - Declarations decls; - this(Identifier* name, TemplateParameters tparams, Declarations decls) - { - super.hasBody = true; - mixin(set_kind); - addOptChild(tparams); - addChild(decls); - - this.name = name; - this.tparams = tparams; - this.decls = decls; - } -} - -class NewDeclaration : Declaration -{ - Parameters parameters; - FunctionBody funcBody; - this(Parameters parameters, FunctionBody funcBody) - { - super.hasBody = true; - mixin(set_kind); - addChild(parameters); - addChild(funcBody); - - this.parameters = parameters; - this.funcBody = funcBody; - } -} - -class DeleteDeclaration : Declaration -{ - Parameters parameters; - FunctionBody funcBody; - this(Parameters parameters, FunctionBody funcBody) - { - super.hasBody = true; - mixin(set_kind); - addChild(parameters); - addChild(funcBody); - - this.parameters = parameters; - this.funcBody = funcBody; - } -} - -class AttributeDeclaration : Declaration -{ - TOK attribute; - Declaration decls; - this(TOK attribute, Declaration decls) - { - super.hasBody = true; - mixin(set_kind); - addChild(decls); - - this.attribute = attribute; - this.decls = decls; - } -} - -class ProtectionDeclaration : AttributeDeclaration -{ - Protection prot; - this(Protection prot, Declaration decls) - { - super(cast(TOK)0, decls); - mixin(set_kind); - this.prot = prot; - } -} - -class StorageClassDeclaration : AttributeDeclaration -{ - StorageClass storageClass; - this(StorageClass storageClass, TOK tok, Declaration decl) - { - super(tok, decl); - mixin(set_kind); - - this.storageClass = storageClass; - } -} - -class LinkageDeclaration : AttributeDeclaration -{ - LinkageType linkageType; - this(LinkageType linkageType, Declaration decls) - { - super(TOK.Extern, decls); - mixin(set_kind); - - this.linkageType = linkageType; - } -} - -class AlignDeclaration : AttributeDeclaration -{ - int size; - this(int size, Declaration decls) - { - super(TOK.Align, decls); - mixin(set_kind); - this.size = size; - } -} - -class PragmaDeclaration : AttributeDeclaration -{ - Identifier* ident; - Expression[] args; - this(Identifier* ident, Expression[] args, Declaration decls) - { - addOptChildren(args); // Add args before calling super(). - super(TOK.Pragma, decls); - mixin(set_kind); - - this.ident = ident; - this.args = args; - } - - override void semantic(Scope scop) - { - pragmaSemantic(scop, begin, ident, args); - decls.semantic(scop); - } -} - -class MixinDeclaration : Declaration -{ - Expression[] templateIdents; - Identifier* mixinIdent; - Expression argument; // mixin ( AssignExpression ) - - this(Expression[] templateIdents, Identifier* mixinIdent) - { - mixin(set_kind); - addChildren(templateIdents); - - this.templateIdents = templateIdents; - this.mixinIdent = mixinIdent; - } - - this(Expression argument) - { - mixin(set_kind); - addChild(argument); - - this.argument = argument; - } -}
--- a/trunk/src/dil/Expressions.d Sat Jan 05 22:50:09 2008 +0100 +++ b/trunk/src/dil/Expressions.d Sat Jan 05 23:01:42 2008 +0100 @@ -7,7 +7,7 @@ import dil.ast.Node; import dil.Token; import dil.Types; -import dil.Declarations; +import dil.ast.Declarations; import dil.Statements; import dil.Identifier; import dil.Scope;
--- a/trunk/src/dil/Module.d Sat Jan 05 22:50:09 2008 +0100 +++ b/trunk/src/dil/Module.d Sat Jan 05 23:01:42 2008 +0100 @@ -5,7 +5,7 @@ module dil.Module; import dil.ast.Node; -import dil.Declarations; +import dil.ast.Declarations; import dil.parser.Parser; import dil.parser.ImportParser; import dil.lexer.Lexer;
--- a/trunk/src/dil/SettingsLoader.d Sat Jan 05 22:50:09 2008 +0100 +++ b/trunk/src/dil/SettingsLoader.d Sat Jan 05 23:01:42 2008 +0100 @@ -6,7 +6,7 @@ import dil.Settings; import dil.Messages; -import dil.Module, dil.ast.Node, dil.Declarations, dil.Expressions; +import dil.Module, dil.ast.Node, dil.ast.Declarations, dil.Expressions; import dil.File; import tango.io.FilePath; import common;
--- a/trunk/src/dil/Statements.d Sat Jan 05 22:50:09 2008 +0100 +++ b/trunk/src/dil/Statements.d Sat Jan 05 23:01:42 2008 +0100 @@ -6,7 +6,7 @@ import dil.ast.Node; import dil.Expressions; -import dil.Declarations; +import dil.ast.Declarations; import dil.Types; import dil.Token; import dil.IdTable;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/trunk/src/dil/ast/Declarations.d Sat Jan 05 23:01:42 2008 +0100 @@ -0,0 +1,782 @@ +/++ + Author: Aziz Köksal + License: GPL3 ++/ +module dil.ast.Declarations; + +import dil.ast.Node; +import dil.Expressions; +import dil.Types; +import dil.Statements; +import dil.Token; +import dil.Enums; +import dil.Scope; +import dil.IdTable; +import dil.semantic.Analysis; +import dil.Symbols; +import dil.semantic.Types; +import dil.Messages; +import common; + +abstract class Declaration : Node +{ + bool hasBody; + this() + { + super(NodeCategory.Declaration); + } + + // Members relevant to semantic phase. + StorageClass stc; /// The storage class of this declaration. + Protection prot; /// The protection attribute of this declaration. + + void semantic(Scope sc) + { + foreach (node; this.children) + { + assert(node !is null); + if (node.category == NodeCategory.Declaration) + (cast(Declaration)cast(void*)node).semantic(sc); + } + } + + final bool isStatic() + { + return !!(stc & StorageClass.Static); + } + + final bool isPublic() + { + return !!(prot & Protection.Public); + } + + final void setStorageClass(StorageClass stc) + { + this.stc = stc; + } + + final void setProtection(Protection prot) + { + this.prot = prot; + } + +} + +class Declarations : Declaration +{ + this() + { + hasBody = true; + mixin(set_kind); + } + + void opCatAssign(Declaration d) + { + addChild(d); + } + + void opCatAssign(Declarations ds) + { + addChildren(ds.children); + } + + override void semantic(Scope scop) + { + foreach (node; this.children) + { + assert(node.category == NodeCategory.Declaration); + (cast(Declaration)cast(void*)node).semantic(scop); + } + } +} + +/// Single semicolon. +class EmptyDeclaration : Declaration +{ + this() + { + mixin(set_kind); + } + + override void semantic(Scope) + {} +} + +/++ + Illegal declarations encompass all tokens that don't + start a DeclarationDefinition. + See_Also: dil.Token.isDeclDefStartToken() ++/ +class IllegalDeclaration : Declaration +{ + this() + { + mixin(set_kind); + } + + override void semantic(Scope) + {} +} + +/// FQN = fully qualified name +alias Identifier*[] ModuleFQN; // Identifier(.Identifier)* + +class ModuleDeclaration : Declaration +{ + Identifier* moduleName; + Identifier*[] packages; + this(ModuleFQN moduleFQN) + { + mixin(set_kind); + assert(moduleFQN.length != 0); + this.moduleName = moduleFQN[$-1]; + this.packages = moduleFQN[0..$-1]; + } + + char[] getFQN() + { + auto pname = getPackageName('.'); + if (pname.length) + return pname ~ "." ~ getName(); + else + return getName(); + } + + char[] getName() + { + if (moduleName) + return moduleName.str; + return null; + } + + char[] getPackageName(char separator) + { + char[] pname; + foreach (pckg; packages) + if (pckg) + pname ~= pckg.str ~ separator; + if (pname.length) + pname = pname[0..$-1]; // Remove last separator + return pname; + } +} + +class ImportDeclaration : Declaration +{ + private alias Identifier*[] Ids; + ModuleFQN[] moduleFQNs; + Ids moduleAliases; + Ids bindNames; + Ids bindAliases; + + this(ModuleFQN[] moduleFQNs, Ids moduleAliases, Ids bindNames, Ids bindAliases, bool isStatic) + { + mixin(set_kind); + this.moduleFQNs = moduleFQNs; + this.moduleAliases = moduleAliases; + this.bindNames = bindNames; + this.bindAliases = bindAliases; + if (isStatic) + this.stc |= StorageClass.Static; + } + + char[][] getModuleFQNs(char separator) + { + char[][] FQNs; + foreach (moduleFQN; moduleFQNs) + { + char[] FQN; + foreach (ident; moduleFQN) + if (ident) + FQN ~= ident.str ~ separator; + FQNs ~= FQN[0..$-1]; // Remove last separator + } + return FQNs; + } +} + +class AliasDeclaration : Declaration +{ + Declaration decl; + this(Declaration decl) + { + mixin(set_kind); + addChild(decl); + this.decl = decl; + } +} + +class TypedefDeclaration : Declaration +{ + Declaration decl; + this(Declaration decl) + { + mixin(set_kind); + addChild(decl); + this.decl = decl; + } +} + +class EnumDeclaration : Declaration +{ + Identifier* name; + TypeNode baseType; + EnumMember[] members; + this(Identifier* name, TypeNode baseType, EnumMember[] members, bool hasBody) + { + super.hasBody = hasBody; + mixin(set_kind); + addOptChild(baseType); + addOptChildren(members); + + this.name = name; + this.baseType = baseType; + this.members = members; + } +} + +class EnumMember : Node +{ + Identifier* name; + Expression value; + this(Identifier* name, Expression value) + { + super(NodeCategory.Other); + mixin(set_kind); + addOptChild(value); + + this.name = name; + this.value = value; + } +} + +abstract class AggregateDeclaration : Declaration +{ + Identifier* name; + TemplateParameters tparams; + Declarations decls; + this(Identifier* name, TemplateParameters tparams, Declarations decls) + { + super.hasBody = decls !is null; + this.name = name; + this.tparams = tparams; + this.decls = decls; + } +} + +class ClassDeclaration : AggregateDeclaration +{ + BaseClass[] bases; + this(Identifier* name, TemplateParameters tparams, BaseClass[] bases, Declarations decls) + { + super(name, tparams, decls); + mixin(set_kind); + addOptChild(tparams); + addOptChildren(bases); + addOptChild(decls); + + this.bases = bases; + } + + Class class_; /// The class symbol for this declaration. + + override void semantic(Scope scop) + { + if (class_) + return; + class_ = new Class(name, this); + // Create a new scope. + scop = scop.push(class_); + // Continue semantic analysis. + decls && decls.semantic(scop); + scop.pop(); + } +} + +class InterfaceDeclaration : AggregateDeclaration +{ + BaseClass[] bases; + this(Identifier* name, TemplateParameters tparams, BaseClass[] bases, Declarations decls) + { + super(name, tparams, decls); + mixin(set_kind); + addOptChild(tparams); + addOptChildren(bases); + addOptChild(decls); + + this.bases = bases; + } + + alias dil.Symbols.Interface InterfaceSymbol; + + InterfaceSymbol interface_; /// The interface symbol for this declaration. + + override void semantic(Scope scop) + { + if (interface_) + return; + interface_ = new InterfaceSymbol(name, this); + // Create a new scope. + scop = scop.push(interface_); + // Continue semantic analysis. + decls && decls.semantic(scop); + scop.pop(); + } +} + +class StructDeclaration : AggregateDeclaration +{ + uint alignSize; + this(Identifier* name, TemplateParameters tparams, Declarations decls) + { + super(name, tparams, decls); + mixin(set_kind); + addOptChild(tparams); + addOptChild(decls); + } + + void setAlignSize(uint alignSize) + { + this.alignSize = alignSize; + } + + Struct struct_; /// The struct symbol for this declaration. + + override void semantic(Scope scop) + { + if (struct_) + return; + struct_ = new Struct(name, this); + // Create a new scope. + scop = scop.push(struct_); + // Continue semantic analysis. + decls && decls.semantic(scop); + scop.pop(); + } +} + +class UnionDeclaration : AggregateDeclaration +{ + this(Identifier* name, TemplateParameters tparams, Declarations decls) + { + super(name, tparams, decls); + mixin(set_kind); + addOptChild(tparams); + addOptChild(decls); + } + + Union union_; /// The union symbol for this declaration. + + override void semantic(Scope scop) + { + if (union_) + return; + union_ = new Union(name, this); + // Create a new scope. + scop = scop.push(union_); + // Continue semantic analysis. + decls && decls.semantic(scop); + scop.pop(); + } +} + +class ConstructorDeclaration : Declaration +{ + Parameters parameters; + FunctionBody funcBody; + this(Parameters parameters, FunctionBody funcBody) + { + super.hasBody = true; + mixin(set_kind); + addChild(parameters); + addChild(funcBody); + + this.parameters = parameters; + this.funcBody = funcBody; + } +} + +class StaticConstructorDeclaration : Declaration +{ + FunctionBody funcBody; + this(FunctionBody funcBody) + { + super.hasBody = true; + mixin(set_kind); + addChild(funcBody); + + this.funcBody = funcBody; + } +} + +class DestructorDeclaration : Declaration +{ + FunctionBody funcBody; + this(FunctionBody funcBody) + { + super.hasBody = true; + mixin(set_kind); + addChild(funcBody); + + this.funcBody = funcBody; + } +} + +class StaticDestructorDeclaration : Declaration +{ + FunctionBody funcBody; + this(FunctionBody funcBody) + { + super.hasBody = true; + mixin(set_kind); + addChild(funcBody); + + this.funcBody = funcBody; + } +} + +class FunctionDeclaration : Declaration +{ + TypeNode returnType; + Identifier* funcName; + TemplateParameters tparams; + Parameters params; + FunctionBody funcBody; + LinkageType linkageType; + this(TypeNode returnType, Identifier* funcName, TemplateParameters tparams, + Parameters params, FunctionBody funcBody) + { + super.hasBody = funcBody.funcBody !is null; + mixin(set_kind); + addChild(returnType); + addOptChild(tparams); + addChild(params); + addChild(funcBody); + + this.returnType = returnType; + this.funcName = funcName; + this.tparams = tparams; + this.params = params; + this.funcBody = funcBody; + } + + void setLinkageType(LinkageType linkageType) + { + this.linkageType = linkageType; + } +} + +class VariableDeclaration : Declaration +{ + TypeNode typeNode; + Identifier*[] idents; + Expression[] values; + LinkageType linkageType; + this(TypeNode typeNode, Identifier*[] idents, Expression[] values) + { + // No empty arrays allowed. Both arrays must be of same size. + assert(idents.length != 0 && idents.length == values.length); + // If no type (in case of AutoDeclaration), first value mustn't be null. + assert(typeNode ? 1 : values[0] !is null); + mixin(set_kind); + addOptChild(typeNode); + foreach(value; values) + addOptChild(value); + + this.typeNode = typeNode; + this.idents = idents; + this.values = values; + } + + void setLinkageType(LinkageType linkageType) + { + this.linkageType = linkageType; + } + + Variable[] variables; + + override void semantic(Scope scop) + { + Type type; + + if (typeNode) + // Get type from typeNode. + type = typeNode.semantic(scop); + else + { // Infer type from first initializer. + auto firstValue = values[0]; + firstValue = firstValue.semantic(scop); + type = firstValue.type; + } + assert(type !is null); + + // Check for interface. + if (scop.isInterface) + return scop.error(begin, MSG.InterfaceCantHaveVariables); + + // Iterate over variable identifiers in this declaration. + foreach (i, ident; idents) + { + // Perform semantic analysis on value. + if (values[i]) + values[i] = values[i].semantic(scop); + // Create a new variable symbol. + auto variable = new Variable(stc, linkageType, type, ident, this); + variables ~= variable; + // Add to scope. + scop.insert(variable); + } + } +} + +class InvariantDeclaration : Declaration +{ + FunctionBody funcBody; + this(FunctionBody funcBody) + { + super.hasBody = true; + mixin(set_kind); + addChild(funcBody); + + this.funcBody = funcBody; + } +} + +class UnittestDeclaration : Declaration +{ + FunctionBody funcBody; + this(FunctionBody funcBody) + { + super.hasBody = true; + mixin(set_kind); + addChild(funcBody); + + this.funcBody = funcBody; + } +} + +abstract class ConditionalCompilationDeclaration : Declaration +{ + Token* spec; + Token* cond; + Declaration decls, elseDecls; + + this(Token* spec, Token* cond, Declaration decls, Declaration elseDecls) + { + super.hasBody = decls !is null; + addOptChild(decls); + addOptChild(elseDecls); + + this.spec = spec; + this.cond = cond; + this.decls = decls; + this.elseDecls = elseDecls; + } +} + +class DebugDeclaration : ConditionalCompilationDeclaration +{ + this(Token* spec, Token* cond, Declaration decls, Declaration elseDecls) + { + super(spec, cond, decls, elseDecls); + mixin(set_kind); + } +} + +class VersionDeclaration : ConditionalCompilationDeclaration +{ + this(Token* spec, Token* cond, Declaration decls, Declaration elseDecls) + { + super(spec, cond, decls, elseDecls); + mixin(set_kind); + } +} + +class StaticIfDeclaration : Declaration +{ + Expression condition; + Declaration ifDecls, elseDecls; + this(Expression condition, Declaration ifDecls, Declaration elseDecls) + { + super.hasBody = true; + mixin(set_kind); + addChild(condition); + addOptChild(ifDecls); + addOptChild(elseDecls); + + this.condition = condition; + this.ifDecls = ifDecls; + this.elseDecls = elseDecls; + } +} + +class StaticAssertDeclaration : Declaration +{ + Expression condition, message; + this(Expression condition, Expression message) + { + super.hasBody = true; + mixin(set_kind); + addChild(condition); + addOptChild(message); + + this.condition = condition; + this.message = message; + } +} + +class TemplateDeclaration : Declaration +{ + Identifier* name; + TemplateParameters tparams; + Declarations decls; + this(Identifier* name, TemplateParameters tparams, Declarations decls) + { + super.hasBody = true; + mixin(set_kind); + addOptChild(tparams); + addChild(decls); + + this.name = name; + this.tparams = tparams; + this.decls = decls; + } +} + +class NewDeclaration : Declaration +{ + Parameters parameters; + FunctionBody funcBody; + this(Parameters parameters, FunctionBody funcBody) + { + super.hasBody = true; + mixin(set_kind); + addChild(parameters); + addChild(funcBody); + + this.parameters = parameters; + this.funcBody = funcBody; + } +} + +class DeleteDeclaration : Declaration +{ + Parameters parameters; + FunctionBody funcBody; + this(Parameters parameters, FunctionBody funcBody) + { + super.hasBody = true; + mixin(set_kind); + addChild(parameters); + addChild(funcBody); + + this.parameters = parameters; + this.funcBody = funcBody; + } +} + +class AttributeDeclaration : Declaration +{ + TOK attribute; + Declaration decls; + this(TOK attribute, Declaration decls) + { + super.hasBody = true; + mixin(set_kind); + addChild(decls); + + this.attribute = attribute; + this.decls = decls; + } +} + +class ProtectionDeclaration : AttributeDeclaration +{ + Protection prot; + this(Protection prot, Declaration decls) + { + super(cast(TOK)0, decls); + mixin(set_kind); + this.prot = prot; + } +} + +class StorageClassDeclaration : AttributeDeclaration +{ + StorageClass storageClass; + this(StorageClass storageClass, TOK tok, Declaration decl) + { + super(tok, decl); + mixin(set_kind); + + this.storageClass = storageClass; + } +} + +class LinkageDeclaration : AttributeDeclaration +{ + LinkageType linkageType; + this(LinkageType linkageType, Declaration decls) + { + super(TOK.Extern, decls); + mixin(set_kind); + + this.linkageType = linkageType; + } +} + +class AlignDeclaration : AttributeDeclaration +{ + int size; + this(int size, Declaration decls) + { + super(TOK.Align, decls); + mixin(set_kind); + this.size = size; + } +} + +class PragmaDeclaration : AttributeDeclaration +{ + Identifier* ident; + Expression[] args; + this(Identifier* ident, Expression[] args, Declaration decls) + { + addOptChildren(args); // Add args before calling super(). + super(TOK.Pragma, decls); + mixin(set_kind); + + this.ident = ident; + this.args = args; + } + + override void semantic(Scope scop) + { + pragmaSemantic(scop, begin, ident, args); + decls.semantic(scop); + } +} + +class MixinDeclaration : Declaration +{ + Expression[] templateIdents; + Identifier* mixinIdent; + Expression argument; // mixin ( AssignExpression ) + + this(Expression[] templateIdents, Identifier* mixinIdent) + { + mixin(set_kind); + addChildren(templateIdents); + + this.templateIdents = templateIdents; + this.mixinIdent = mixinIdent; + } + + this(Expression argument) + { + mixin(set_kind); + addChild(argument); + + this.argument = argument; + } +}
--- a/trunk/src/dil/parser/ImportParser.d Sat Jan 05 22:50:09 2008 +0100 +++ b/trunk/src/dil/parser/ImportParser.d Sat Jan 05 23:01:42 2008 +0100 @@ -8,7 +8,7 @@ import dil.parser.Parser; import dil.Token; import dil.Enums; -import dil.Declarations; +import dil.ast.Declarations; import dil.Statements; import common;
--- a/trunk/src/dil/parser/Parser.d Sat Jan 05 22:50:09 2008 +0100 +++ b/trunk/src/dil/parser/Parser.d Sat Jan 05 23:01:42 2008 +0100 @@ -9,7 +9,7 @@ import dil.Token; import dil.Messages; import dil.Information; -import dil.Declarations; +import dil.ast.Declarations; import dil.Statements; import dil.Expressions; import dil.Types;
--- a/trunk/src/main.d Sat Jan 05 22:50:09 2008 +0100 +++ b/trunk/src/main.d Sat Jan 05 23:01:42 2008 +0100 @@ -12,7 +12,7 @@ import dil.SettingsLoader; import dil.CompilerInfo; import dil.Module; -import dil.Declarations, dil.Expressions, dil.ast.Node; +import dil.ast.Declarations, dil.Expressions, dil.ast.Node; import dil.Information; import dil.File; import cmd.Generate;