Changeset 1199

Show
Ignore:
Timestamp:
06/29/08 13:21:02 (6 months ago)
Author:
asterite
Message:

Fixed an important bug and improved SourceElementParser? speed. Added more support for compile-time evaluation.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/descent.core/src/descent/internal/codeassist/EvaluationEngine.java

    r1198 r1199  
    2020import descent.internal.compiler.parser.CallExp; 
    2121import descent.internal.compiler.parser.ComplexExp; 
     22import descent.internal.compiler.parser.Declaration; 
    2223import descent.internal.compiler.parser.EnumDeclaration; 
    2324import descent.internal.compiler.parser.EnumMember; 
     
    3233import descent.internal.compiler.parser.SemanticContext; 
    3334import descent.internal.compiler.parser.StringExp; 
     35import descent.internal.compiler.parser.StructInitializer; 
    3436import descent.internal.compiler.parser.StructLiteralExp; 
    3537import descent.internal.compiler.parser.Type; 
    3638import descent.internal.compiler.parser.TypeEnum; 
    3739import descent.internal.compiler.parser.VarDeclaration; 
     40import descent.internal.compiler.parser.VarExp; 
    3841import descent.internal.compiler.parser.integer_t; 
    3942import descent.internal.compiler.parser.real_t; 
     
    144147            ExpInitializer expInit = (ExpInitializer) init; 
    145148            evalExp(expInit.exp); 
     149        } else if (init.isStructInitializer() != null) { 
     150            StructInitializer structInit = (StructInitializer) init; 
     151             
     152            String name = structInit.ad.ident.toChars(); 
     153            String[] names = new String[structInit.ad.fields.size()];  
     154            for (int i = 0; i < names.length; i++) { 
     155                names[i] = structInit.ad.fields.get(i).ident.toChars(); 
     156            } 
     157            IEvaluationResult[] values = new IEvaluationResult[structInit.value.size()]; 
     158            for (int i = 0; i < values.length; i++) { 
     159                evalInit(structInit.value.get(i)); 
     160                values[i] = result; 
     161            } 
     162             
     163            StructLiteral sl = new StructLiteral(name, names, values); 
     164            result = new EvaluationResult(sl, IEvaluationResult.STRUCT_LITERAL); 
     165             
    146166        } else if (init.isArrayInitializer() != null) { 
    147167            ArrayInitializer arrayInit = (ArrayInitializer) init; 
     
    169189        } else if (exp instanceof NegExp) { 
    170190            // evalExp(((NegExp) exp).e1); 
     191        } else if (exp instanceof VarExp) { 
     192            Declaration decl = ((VarExp) exp).var; 
     193            if (decl instanceof VarDeclaration) { 
     194                VarDeclaration var = (VarDeclaration) decl; 
     195                if (var.isConst()) {  
     196                    evalInit(var.init); 
     197                } 
     198            } 
    171199        } else if (exp instanceof StructLiteralExp) { 
    172200            StructLiteralExp sle = (StructLiteralExp) exp; 
  • trunk/descent.core/src/descent/internal/compiler/SourceElementParser.java

    r1198 r1199  
    2525import descent.internal.compiler.impl.CompilerOptions; 
    2626import descent.internal.compiler.parser.*; 
     27import descent.internal.compiler.parser.ast.ASTNode; 
    2728import descent.internal.compiler.parser.ast.AstVisitorAdapter; 
    2829import descent.internal.compiler.parser.ast.NaiveASTFlattener; 
     
    620621         
    621622        info.type = getSignature(node.type); 
    622         info.initializationSource = encoder.encodeInitializer(node.init); 
     623        info.initializationSource = encode(node.init); 
    623624         
    624625        requestor.enterField(info); 
     
    627628    } 
    628629     
     630    private char[] encode(ASTDmdNode node) { 
     631        if (node == null) { 
     632            return null; 
     633        } 
     634         
     635        char[] value = new char[node.length]; 
     636        System.arraycopy(source, node.start, value, 0, node.length); 
     637        return ASTNodeEncoder.encoderForIndexer(value); 
     638    } 
     639 
    629640    @Override 
    630641    public boolean visit(AliasDeclaration node) { 
     
    689700    @Override 
    690701    public boolean visit(StaticAssert node) { 
    691         requestor.enterInitializer(startOfDeclaration(node), getFlags(node, node.modifiers) | Flags.AccStaticAssert, encoder.encodeExpression(node.exp)); 
     702        requestor.enterInitializer(startOfDeclaration(node), getFlags(node, node.modifiers) | Flags.AccStaticAssert, encode(node.exp)); 
    692703        return false; 
    693704    } 
     
    788799        } 
    789800         
    790         info.initializationSource = encoder.encodeExpression(node.value); 
     801        info.initializationSource = encode(node.value); 
    791802         
    792803        requestor.enterField(info); 
     
    820831    @Override 
    821832    public boolean visit(CompileDeclaration node) { 
    822         requestor.enterInitializer(startOf(node), getFlags(node, node.modifiers) | Flags.AccMixin, encoder.encodeExpression(node.exp)); 
     833        requestor.enterInitializer(startOf(node), getFlags(node, node.modifiers) | Flags.AccMixin, encode(node.exp)); 
    823834        return false; 
    824835    } 
  • trunk/descent.core/src/descent/internal/compiler/lookup/ModuleBuilder.java

    r1198 r1199  
    9191     * Whether to make surface Module semantic. 
    9292     */ 
    93     public boolean LAZY_MODULES = true; 
     93    public boolean LAZY_MODULES = false; 
    9494     
    9595    /* 
  • trunk/descent.core/src/descent/internal/compiler/parser/ASTNodeEncoder.java

    r1163 r1199  
    1111public class ASTNodeEncoder { 
    1212     
    13     private char[] nastyChar = { '/' }; 
    14     private char[] nastyCharSoltuion = { '*', '!', '_', '!', '*' }; 
     13    private final static char[] nastyChar = { '/' }; 
     14    private final static char[] nastyCharSoltuion = { '*', '!', '_', '!', '*' }; 
    1515     
    1616    private Parser parser; 
     
    3333    // string, and then replace it back later 
    3434     
    35     private char[] encoderForIndexer(char[] value) { 
     35    public static char[] encoderForIndexer(char[] value) { 
    3636        if (CharOperation.indexOf('/', value) != -1) { 
    3737            return CharOperation.replace(value, nastyChar, nastyCharSoltuion); 
  • trunk/descent.core/src/descent/internal/compiler/parser/ArrayInitializer.java

    r1189 r1199  
    3333    public void addInit(Expression index, Initializer value) { 
    3434        if (value == null) { 
    35             System.out.println(); 
     35            System.out.println(123456); 
    3636        } 
    3737         
     
    143143            } 
    144144        } 
     145         
    145146        if (new integer_t(dim).multiply(t.next.size(context)).compareTo(amax) >= 0) { 
    146147            if (context.acceptsProblems()) { 
     
    172173 
    173174            Initializer init = value.get(i); 
     175            if (init == null) { 
     176                System.out.println(123456); 
     177            } 
    174178            init = init.syntaxCopy(context); 
    175179            ai.value.set(i, init);