Changeset 1198

Show
Ignore:
Timestamp:
06/29/08 11:58:45 (2 months ago)
Author:
asterite
Message:

Trying a new optimization... will need to cleanup code later. Now struct literals and array literals that are compile-time results are shown in the UI very nicely :-)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/descent.core/META-INF/MANIFEST.MF

    r1149 r1198  
    33Bundle-Name: %pluginName 
    44Bundle-SymbolicName: descent.core;singleton:=true 
    5 Bundle-Version: 0.5.2.20080501 
     5Bundle-Version: 0.5.3.20080622 
    66Bundle-Activator: descent.core.JavaCore 
    77Bundle-Vendor: %providerName 
  • trunk/descent.core/src/descent/core/IEvaluationResult.java

    r1165 r1198  
    170170     * An array result (which is not char[], dchar[] or wchar[]). 
    171171     * {@link #getValue()} can be safely cast to {@link IEvaluationResult[]}. 
    172      * TODO: implement this 
    173172     */ 
    174173    int ARRAY = CREAL + 1; 
     
    179178     */ 
    180179    int COMPILATION_UNIT = ARRAY + 1; 
     180     
     181    /** 
     182     * A struct literal result. 
     183     * {@link #getValue()} can be safely cast to IStructLiteral. 
     184     */ 
     185    int STRUCT_LITERAL = COMPILATION_UNIT + 1; 
    181186     
    182187    /** 
  • trunk/descent.core/src/descent/core/IType.java

    r1089 r1198  
    10741074     */ 
    10751075    String[][] resolveType(String typeName, WorkingCopyOwner owner) throws JavaModelException; 
     1076     
     1077    /** 
     1078     * Determines whether this type was declared like "class Bar;", that 
     1079     * is, it is just a forward declaration definition. 
     1080     */ 
     1081    boolean isForwardDeclaration() throws JavaModelException; 
    10761082} 
  • trunk/descent.core/src/descent/core/dom/CompilationUnitResolver.java

    r1191 r1198  
    4545     
    4646    private final static boolean RESOLVE = true; 
    47     private final static boolean STATS = false; 
     47    private final static boolean STATS = true; 
    4848     
    4949    public static class ParseResult { 
  • trunk/descent.core/src/descent/internal/codeassist/CompletionEngine.java

    r1195 r1198  
    433433             
    434434            time = System.currentTimeMillis() - time; 
    435 //            System.out.println("Completion took " + time + " milliseconds to complete."); 
     435          System.out.println("Completion took " + time + " milliseconds to complete."); 
    436436        } 
    437437    } 
     
    717717        doSemantic(); 
    718718         
     719        node.semantic(Scope.createGlobal(node.mod, semanticContext), semanticContext); 
     720        node.mod.consumeRestStructure(); 
     721        node.mod.consumeRest(); 
     722         
    719723        if (node.mod != null) { 
    720724            if (node.selectiveName == null) { 
     
    13751379                includesFilter = 0; 
    13761380                 
     1381                wantOverrides = false; 
    13771382                if (wantOverrides) { 
    13781383                    List<FuncDeclaration> funcs = new ArrayList<FuncDeclaration>(); 
     
    22852290                if (currentName.length == 0 || match(currentName, ident)) { 
    22862291                    if (member.getSignature() == null) { 
     2292                        member.consumeRest(); 
    22872293                        member.getSignature(); 
    22882294                    } 
  • trunk/descent.core/src/descent/internal/codeassist/EvaluationEngine.java

    r1168 r1198  
    1616import descent.internal.compiler.impl.CompilerOptions; 
    1717import descent.internal.compiler.parser.ASTDmdNode; 
     18import descent.internal.compiler.parser.ArrayInitializer; 
     19import descent.internal.compiler.parser.ArrayLiteralExp; 
    1820import descent.internal.compiler.parser.CallExp; 
    1921import descent.internal.compiler.parser.ComplexExp; 
     
    3032import descent.internal.compiler.parser.SemanticContext; 
    3133import descent.internal.compiler.parser.StringExp; 
     34import descent.internal.compiler.parser.StructLiteralExp; 
    3235import descent.internal.compiler.parser.Type; 
    3336import descent.internal.compiler.parser.TypeEnum; 
     
    141144            ExpInitializer expInit = (ExpInitializer) init; 
    142145            evalExp(expInit.exp); 
     146        } else if (init.isArrayInitializer() != null) { 
     147            ArrayInitializer arrayInit = (ArrayInitializer) init; 
     148             
     149            IEvaluationResult[] er = new IEvaluationResult[arrayInit.value.size()]; 
     150            for (int i = 0; i < er.length; i++) { 
     151                Initializer subInit = arrayInit.value.get(i); 
     152                evalInit(subInit); 
     153                er[i] = result; 
     154            } 
     155             
     156            result = new EvaluationResult(er, IEvaluationResult.ARRAY); 
    143157        } 
    144158    } 
     
    155169        } else if (exp instanceof NegExp) { 
    156170            // evalExp(((NegExp) exp).e1); 
     171        } else if (exp instanceof StructLiteralExp) { 
     172            StructLiteralExp sle = (StructLiteralExp) exp; 
     173            String name = sle.sd.ident.toChars(); 
     174            String[] names = new String[sle.sd.fields.size()];  
     175            for (int i = 0; i < names.length; i++) { 
     176                names[i] = sle.sd.fields.get(i).ident.toChars(); 
     177            } 
     178            IEvaluationResult[] values = new IEvaluationResult[sle.elements.size()]; 
     179            for (int i = 0; i < values.length; i++) { 
     180                evalExp(sle.elements.get(i)); 
     181                values[i] = result; 
     182            } 
     183             
     184            StructLiteral sl = new StructLiteral(name, names, values); 
     185            result = new EvaluationResult(sl, IEvaluationResult.STRUCT_LITERAL); 
     186        } else if (exp instanceof ArrayLiteralExp) { 
     187            ArrayLiteralExp ale = (ArrayLiteralExp) exp; 
     188             
     189            IEvaluationResult[] er = new IEvaluationResult[ale.elements.size()]; 
     190            for (int i = 0; i < er.length; i++) { 
     191                evalExp(ale.elements.get(i)); 
     192                er[i] = result; 
     193            } 
     194             
     195            result = new EvaluationResult(er, IEvaluationResult.ARRAY); 
    157196        } 
    158197    } 
  • trunk/descent.core/src/descent/internal/codeassist/EvaluationResult.java

    r987 r1198  
    2323    @Override 
    2424    public String toString() { 
     25        if (value instanceof IEvaluationResult[]) { 
     26            IEvaluationResult[] results = (IEvaluationResult[]) value; 
     27             
     28            StringBuilder sb = new StringBuilder(); 
     29            sb.append("["); 
     30            for (int i = 0; i < results.length; i++) { 
     31                if (i != 0) { 
     32                    sb.append(", "); 
     33                } 
     34                sb.append(results[i]); 
     35            } 
     36            sb.append("]"); 
     37            return sb.toString(); 
     38        } 
    2539        return value.toString(); 
    2640    } 
  • trunk/descent.core/src/descent/internal/codeassist/complete/CompletionParser.java

    r1195 r1198  
    900900    @Override 
    901901    protected AggregateDeclaration endAggregateDeclaration(AggregateDeclaration a) { 
    902       if (a instanceof ClassDeclaration && a.start < cursorLocation && cursorLocation < a.start + a.length) { 
    903           ClassDeclaration original = (ClassDeclaration) a; 
    904           CompletionOnClassDeclaration cc = new CompletionOnClassDeclaration(original.loc, original.ident, original.baseclasses); 
    905           cc.members = original.members; 
    906           cc.sourceMembers = original.sourceMembers; 
    907           cc.isCompletingScope = true; 
    908            
    909           assistNode = cc; 
    910           return cc; 
    911       } 
     902//        if (a instanceof ClassDeclaration && a.start < cursorLocation && cursorLocation < a.start + a.length) { 
     903//            ClassDeclaration original = (ClassDeclaration) a; 
     904//            CompletionOnClassDeclaration cc = new CompletionOnClassDeclaration(original.loc, original.ident, original.baseclasses); 
     905//            cc.members = original.members; 
     906//            cc.sourceMembers = original.sourceMembers; 
     907//            cc.isCompletingScope = true; 
     908//             
     909//            assistNode = cc; 
     910//            return cc; 
     911//        } 
    912912        return super.endAggregateDeclaration(a); 
    913913    } 
  • trunk/descent.core/src/descent/internal/compiler/ISourceElementRequestor.java

    r1098 r1198  
    4747        public char[][] superinterfaces; 
    4848        public TypeParameterInfo[] typeParameters; 
     49        public boolean isForwardDeclaration; 
    4950    } 
    5051     
  • trunk/descent.core/src/descent/internal/compiler/SourceElementParser.java

    r1192 r1198  
    367367            } 
    368368        } 
     369        info.isForwardDeclaration = node.members == null; 
    369370        //info.secondary = !foundType; 
    370371         
     
    765766            info.nameSourceEnd = node.start + 3; // enum 
    766767        } 
    767          
     768        info.isForwardDeclaration = node.members == null; 
    768769        info.superinterfaces = node.memtype == null ? CharOperation.NO_CHAR_CHAR : new char[][] { getSignature(node.memtype) }; 
    769770         
  • trunk/descent.core/src/descent/internal/compiler/lookup/ModuleBuilder.java

    </
    r1168 r1198  
    7272import descent.internal.compiler.parser.VersionCondition; 
    7373import descent.internal.compiler.parser.VersionSymbol; 
     74import descent.internal.core.CompilationUnit; 
     75import descent.internal.core.CompilationUnitElementInfo; 
    7476import descent.internal.core.CompilerConfiguration; 
    7577import descent.internal.core.InternalSignature; 
     
    8991     * Whether to make surface Module semantic. 
    9092     */ 
    91     public boolean LAZY_MODULES = LAZY & false; 
     93    public boolean LAZY_MODULES = true; 
    9294     
    9395    /* 
     
    135137     * Currently doesn't work. 
    136138     */ 
    137     public boolean LAZY_VARS = LAZY & false; 
     139    public boolean LAZY_VARS = LAZY & true; 
    138140     
    139141    /* 
     
    162164     * is returned normally, without skipping it. 
    163165     */ 
    164     class State { 
     166    public static class State { 
    165167        HashtableOfCharArrayAndObject versions = new HashtableOfCharArrayAndObject(); 
    166168        HashtableOfCharArrayAndObject debugs = new HashtableOfCharArrayAndObject(); 
     
    169171     
    170172    private final ASTNodeEncoder encoder;    
    171     private final CompilerConfiguration config; 
     173    public final CompilerConfiguration config; 
    172174     
    173175    /** 
     
    198200     * @return the module representing the unit 
    199201     */ 
    200     public Module build(final ICompilationUnit unit) {       
     202    public Module build(final ICompilationUnit unit) { 
     203//      long time = System.currentTimeMillis(); 
     204         
    201205        final Module module = new Module(unit.getElementName(), new IdentifierExp(unit.getModuleName().toCharArray())); 
    202206        module.setJavaElement(unit); 
    203207        module.moduleName = unit.getFullyQualifiedName(); 
    204208         
    205         if (LAZY_MODULES) { 
    206             module.setJavaElement(unit); 
    207             module.rest = new SemanticRest(new Runnable() { 
    208                 public void run() { 
    209                     try { 
    210                         long time = System.currentTimeMillis(); 
    211                          
    212                         IPackageDeclaration[] packageDeclarations = unit.getPackageDeclarations(); 
    213                         if (packageDeclarations.length == 1) { 
    214                             String elementName = packageDeclarations[0].getElementName(); 
    215                             Identifiers packages = new Identifiers(); 
    216                             IdentifierExp name = splitName(elementName, packages);   
    217                             module.md = new ModuleDeclaration(packages, name); 
    218                         } 
    219                          
    220                         State state = new State(); 
    221                          
    222                         module.members = new Dsymbols(); 
    223                         fill(module, module.members, unit.getChildren(), state); 
    224                          
    225                         state.surface = false; 
    226                          
    227                         time = System.currentTimeMillis() - time; 
    228                         System.out.println(module.moduleName + ": " + time); 
    229                     } catch (JavaModelException e) { 
    230                         Util.log(e); 
    231                     } 
    232                 } 
    233             }); 
    234             module.rest.skipScopeCheck = true; 
    235         } else { 
     209//      if (LAZY_MODULES) { 
     210//          module.setJavaElement(unit); 
     211//          module.rest = new SemanticRest(new Runnable() { 
     212//              public void run() { 
     213//                  try { 
     214//                      IPackageDeclaration[] packageDeclarations = unit.getPackageDeclarations(); 
     215//                      if (packageDeclarations.length == 1) { 
     216//                          String elementName = packageDeclarations[0].getElementName(); 
     217//                          Identifiers packages = new Identifiers(); 
     218//                          IdentifierExp name = splitName(elementName, packages);   
     219//                          module.md = new ModuleDeclaration(packages, name); 
     220//                      } 
     221//                       
     222//                      State state = new State(); 
     223//                       
     224//                      module.members = new Dsymbols(); 
     225////                        fill(module, module.members, unit.getChildren(), state); 
     226//                       
     227//                      state.surface = false; 
     228//                  } catch (JavaModelException e) { 
     229//                      Util.log(e); 
     230//                  } 
     231//              } 
     232//          }); 
     233//          module.rest.skipScopeCheck = true; 
     234//      } else { 
     235         
     236        IPackageDeclaration[] packageDeclarations; 
     237        try { 
     238            packageDeclarations = unit.getPackageDeclarations(); 
     239            if (packageDeclarations.length == 1) { 
     240                String elementName = packageDeclarations[0].getElementName(); 
     241                Identifiers packages = new Identifiers(); 
     242                IdentifierExp name = splitName(elementName, packages);   
     243                module.md = new ModuleDeclaration(packages, name); 
     244            } 
     245        } catch (JavaModelException e) { 
     246            Util.log(e); 
     247        } 
     248         
     249        CompilationUnitElementInfo info = null; 
     250        try { 
     251            info = (CompilationUnitElementInfo) ((CompilationUnit) unit).getElementInfo(); 
     252        } catch (JavaModelException e) { 
     253            Util.log(e); 
     254        } 
     255         
     256        if (!LAZY_MODULES || "object".equals(module.moduleName) || (info != null && info.hasTopLevelCompileTimeDifficulties())) { 
    236257            try { 
    237                 IPackageDeclaration[] packageDeclarations = unit.getPackageDeclarations(); 
    238                 if (packageDeclarations.length == 1) { 
    239                     String elementName = packageDeclarations[0].getElementName(); 
    240                     Identifiers packages = new Identifiers(); 
    241                     IdentifierExp name = splitName(elementName, packages);   
    242                     module.md = new ModuleDeclaration(packages, name); 
    243                 } 
    244                  
    245258                State state = new State(); 
    246259                 
     
    251264            } catch (JavaModelException e) { 
    252265                Util.log(e); 
    253                 return null; 
    254             } 
    255         } 
     266            } 
     267        } else { 
     268            module.builder = this; 
     269        } 
     270         
     271//      } 
     272//       
     273//      time = System.currentTimeMillis() - time; 
     274//      if (time > 10) { 
     275//          System.out.println("ModuleBuilder#build(" + module.moduleName + ") = " + time); 
     276//      } 
    256277         
    257278        return module; 
    258279    } 
    259280     
    260     private void fill(Module module, Dsymbols members, IJavaElement[] elements,  
     281    public void fill(Module module, Dsymbols members, IJavaElement[] elements,  
    261282            State state) throws JavaModelException { 
    262283        for(IJavaElement elem : elements) { 
    263             switch(elem.getElementType()) { 
    264             case IJavaElement.IMPORT_CONTAINER: 
    265                 IImportContainer container = (IImportContainer) elem; 
    266                 fillImportContainer(module, members, container, state); 
    267                 break; 
    268             case IJavaElement.IMPORT_DECLARATION: 
    269                 IImportDeclaration impDecl = ((IImportDeclaration) elem); 
    270                 fillImportDeclaration(module, members, impDecl); 
    271                 break; 
    272             case IJavaElement.FIELD: 
    273                 IField field = (IField) elem; 
    274                 fillField(module, members, field, state); 
    275                 break; 
    276             case IJavaElement.TYPE: 
    277                 IType type = (IType) elem; 
    278                 fillType(module, members, type, state); 
    279                 break; 
    280             case IJavaElement.METHOD: 
    281                 IMethod method = (IMethod) elem; 
    282                 fillMethod(module, members, method, state.surface); 
    283                 break; 
    284             case IJavaElement.INITIALIZER: 
    285                 IInitializer init = (IInitializer) elem; 
    286                 fillInitializer(module, members, init, state); 
    287                 break; 
    288             case IJavaElement.CONDITIONAL: 
    289                 IConditional cond = (IConditional) elem; 
    290                 fillConditional(module, members, cond, state); 
    291                 break; 
    292             } 
     284            fill(module, members, state, elem); 
     285        } 
     286    } 
     287 
     288    public void fill(Module module, Dsymbols members, State state, IJavaElement elem) throws JavaModelException { 
     289        switch(elem.getElementType()) { 
     290        case IJavaElement.IMPORT_CONTAINER: 
     291            IImportContainer container = (IImportContainer) elem; 
     292            fillImportContainer(module, members, container, state); 
     293            break; 
     294        case IJavaElement.IMPORT_DECLARATION: 
     295            IImportDeclaration impDecl = ((IImportDeclaration) elem); 
     296            fillImportDeclaration(module, members, impDecl); 
     297            break; 
     298        case IJavaElement.FIELD: 
     299            IField field = (IField) elem; 
     300            fillField(module, members, field, state); 
     301            break; 
     302        case IJavaElement.TYPE: 
     303            IType type = (IType) elem; 
     304            fillType(module, members, type, state); 
     305            break; 
     306        case IJavaElement.METHOD: 
     307            IMethod method = (IMethod) elem; 
     308            fillMethod(module, members, method, state.surface); 
     309            break; 
     310        case IJavaElement.INITIALIZER: 
     311            IInitializer init = (IInitializer) elem; 
     312            fillInitializer(module, members, init, state); 
     313            break; 
     314        case IJavaElement.CONDITIONAL: 
     315            IConditional cond = (IConditional) elem; 
     316            fillConditional(module, members, cond, state); 
     317            break; 
    293318        } 
    294319    } 
     
    485510    } 
    486511 
    487     private void fillType(final Module module, Dsymbols members, final IType type,  
     512    public void fillType(final Module module, Dsymbols members, final IType type,  
    488513            final State state) throws JavaModelException { 
    489514        boolean surface = state.surface; 
     
    502527                                member.sourceBaseclasses = new BaseClasses(member.baseclasses); 
    503528                            } 
     529                            if (type.isForwardDeclaration()) { 
     530                                return; 
     531                            } 
    504532                            member.members = new Dsymbols(); 
    505533                            fill(module, member.members, type.getChildren(), state); 
     
    507535                        } catch (JavaModelException e) { 
    508536                            Util.log(e); 
    509                         }   
     537                        } 
    510538                    }; 
    511539                }); 
    512540            } else { 
    513541                member = new ClassDeclaration(getLoc(module, type), getIdent(type), getBaseClasses(type)); 
    514                 member.members = new Dsymbols(); 
    515                 fill(module, member.members, type.getChildren(), state); 
    516                 member.sourceMembers = new Dsymbols(member.members); 
     542                 
     543                if (!type.isForwardDeclaration()) { 
     544                    member.members = new Dsymbols(); 
     545                    fill(module, member.members, type.getChildren(), state); 
     546                    member.sourceMembers = new Dsymbols(member.members); 
     547                } 
    517548            } 
    518549 
     
    531562                                member.sourceBaseclasses = new BaseClasses(member.baseclasses); 
    532563                            } 
     564                            if (type.isForwardDeclaration()) { 
     565                                return; 
     566                            } 
    533567                            member.members = new Dsymbols(); 
    534568                            fill(module, member.members, type.getChildren(), state); 
     
    543577                member = new InterfaceDeclaration(getLoc(module, type), getIdent(type), getBaseClasses(type)); 
    544578                 
    545                 member.members = new Dsymbols(); 
    546                 fill(module, member.members, type.getChildren(), state); 
    547                 member.sourceMembers = new Dsymbols(member.members); 
     579                if (!type.isForwardDeclaration()) { 
     580                    member.members = new Dsymbols(); 
     581                    fill(module, member.members, type.getChildren(), state); 
     582                    member.sourceMembers = new Dsymbols(member.members); 
     583                } 
    548584            } 
    549585             
     
    561597                    member.rest = new SemanticRest(new Runnable() { 
    562598                        public void run() { 
    563                             member.members = new Dsymbols(); 
    564599                            try { 
     600                                if (type.isForwardDeclaration()) { 
     601                                    return; 
     602                                } 
     603                                 
     604                                member.members = new Dsymbols(); 
    565605                                fill(module, member.members, type.getChildren(), state); 
    566606                                member.sourceMembers = new Dsymbols(member.members); 
     
    572612                } else { 
    573613                    member = new StructDeclaration(getLoc(module, type), id); 
    574                     member.members = new Dsymbols(); 
    575                     fill(module, member.members, type.getChildren(), state); 
    576                     member.sourceMembers = new Dsymbols(member.members); 
     614                     
     615                    if (!type.isForwardDeclaration()) { 
     616                        member.members = new Dsymbols(); 
     617                        fill(module, member.members, type.getChildren(), state); 
     618                        member.sourceMembers = new Dsymbols(member.members); 
     619                    } 
    577620                } 
    578621                 
     
    591634                    member.rest = new SemanticRest(new Runnable() { 
    592635                        public void run() { 
    593                             member.members = new Dsymbols(); 
    594636                            try { 
     637                                if (type.isForwardDeclaration()) { 
     638                                    return; 
     639                                } 
     640 
     641                                member.members = new Dsymbols(); 
    595642                                fill(module, member.members, type.getChildren(), state); 
    596643                                member.sourceMembers = new Dsymbols(member.members); 
     
    603650                    member = new UnionDeclaration(getLoc(module, type), id); 
    604651                     
    605                     member.members = new Dsymbols(); 
    606                     fill(module, member.members, type.getChildren(), state); 
    607                     member.sourceMembers = new Dsymbols(member.members); 
     652                    if (!type.isForwardDeclaration()) { 
     653                        member.members = new Dsymbols(); 
     654                        fill(module, member.members, type.getChildren(), state); 
     655                        member.sourceMembers = new Dsymbols(member.members); 
     656                    } 
    608657                } 
    609658                 
     
    612661            } 
    613662        } else if (type.isEnum()) { 
    614             IdentifierExp ident = getIdent(type); 
    615              
    616             final EnumDeclaration member; 
    617              
    618             // For anonymous enums we can do it lazily  
    619             if (LAZY_ENUMS && surface && ident != null) { 
    620                 member = new EnumDeclaration(getLoc(module, type), ident, null); 
    621                 member.rest = new SemanticRest(new Runnable() { 
    622                     public void run() { 
    623                         try { 
    624                             BaseClasses baseClasses = getBaseClasses(type); 
    625                             member.memtype = baseClasses.isEmpty() ? Type.tint32 : baseClasses.get(0).type; 
    626                              
    627                             member.members = new Dsymbols(); 
    628                             for(IJavaElement sub : type.getChildren()) { 
    629                                 IField field = (IField) sub; 
    630                                 EnumMember enumMember = new EnumMember(getLoc(module, field), getIdent(field), getExpression(field)); 
    631                                 enumMember.setJavaElement(field); 
    632                                 member.members.add(enumMember); 
    633                             } 
    634                             member.sourceMembers = new Dsymbols(member.members); 
    635                         } catch (JavaModelException e) { 
    636                             Util.log(e); 
    637                         } 
    638                     } 
    639                 }); 
    640             } else { 
    641                 BaseClasses baseClasses = getBaseClasses(type); 
    642                 member = new EnumDeclaration(getLoc(module, type), ident, baseClasses.isEmpty() ? Type.tint32 : baseClasses.get(0).type); 
    643                  
    644                 member.members = new Dsymbols(); 
    645                 for(IJavaElement sub : type.getChildren()) { 
    646                     IField field = (IField) sub; 
    647                     EnumMember enumMember = new EnumMember(getLoc(module, field), getIdent(field), getExpression(field)); 
    648                     enumMember.setJavaElement(field); 
    649                     member.members.add(enumMember); 
    650                 } 
    651                 member.sourceMembers = new Dsymbols(member.members); 
    652             } 
    653              
    654             member.setJavaElement(type); 
    655             members.add(wrap(member, type)); 
     663            fillEnum(module, members, type, surface); 
    656664        } else if (type.isTemplate()) { 
    657665            final TemplateDeclaration member; 
     
    687695    } 
    688696 
    689     private void fillAnon(Module module, Dsymbols members, IType type,  
     697    public Dsymbol fillEnum(final Module module, Dsymbols members, final IType type, boolean surface) throws JavaModelException { 
     698        IdentifierExp ident = getIdent(type); 
     699         
     700        final EnumDeclaration member; 
     701         
     702        // For anonymous enums we can do it lazily  
     703        if (LAZY_ENUMS && surface && ident != null) { 
     704            member = new EnumDeclaration(getLoc(module, type), ident, null); 
     705            member.rest = new SemanticRest(new Runnable() { 
     706                public void run() { 
     707                    try { 
     708                        BaseClasses baseClasses = getBaseClasses(type); 
     709                        member.memtype = baseClasses.isEmpty() ? Type.tint32 : baseClasses.get(0).type; 
     710                         
     711                        if (type.isForwardDeclaration()) { 
     712                            return; 
     713                        } 
     714                         
     715                        member.members = new Dsymbols(); 
     716                        for(IJavaElement sub : type.getChildren()) { 
     717                            IField field = (IField) sub; 
     718                            EnumMember enumMember = new EnumMember(getLoc(module, field), getIdent(field), getExpression(field)); 
     719                            enumMember.setJavaElement(field); 
     720                            member.members.add(enumMember); 
     721                        } 
     722                        member.sourceMembers = new Dsymbols(member.members); 
     723                    } catch (JavaModelException e) { 
     724                        Util.log(e); 
     725                    } 
     726                } 
     727            }); 
     728        } else { 
     729            BaseClasses baseClasses = getBaseClasses(type); 
     730            member = new EnumDeclaration(getLoc(module, type), ident, baseClasses.isEmpty() ? Type.tint32 : baseClasses.get(0).type); 
     731             
     732            if (!type.isForwardDeclaration()) { 
     733                member.members = new Dsymbols(); 
     734                for(IJavaElement sub : type.getChildren()) { 
     735                    IField field = (IField) sub; 
     736                    EnumMember enumMember = new EnumMember(getLoc(module, field), getIdent(field), getExpression(field)); 
     737                    enumMember.setJavaElement(field); 
     738                    member.members.add(enumMember); 
     739                } 
     740                member.sourceMembers = new Dsymbols(member.members); 
     741            } 
     742        } 
     743         
     744        member.setJavaElement(type); 
     745        Dsymbol sym = wrap(member, type); 
     746        members.add(sym); 
     747        return sym; 
     748    } 
     749 
     750    public void fillAnon(Module module, Dsymbols members, IType type,  
    690751            boolean isUnion, State state) throws JavaModelException { 
    691752        Dsymbols symbols = new Dsymbols(); 
     
    696757    } 
    697758 
    698     private void fillField(Module module, Dsymbols members, final IField field, State state) throws JavaModelException { 
     759    public void fillField(Module module, Dsymbols members, final IField field, State state) throws JavaModelException { 
    699760        if (field.isVariable()) { 
    700761            final VarDeclaration member; 
     
    747808    } 
    748809 
    749     private void fillImportDeclaration(Module module, Dsymbols members, IImportDeclaration impDecl) throws JavaModelException { 
     810    public Dsymbol fillImportDeclaration(Module module, Dsymbols members, IImportDeclaration impDecl) throws JavaModelException { 
    750811        String elementName = impDecl.getElementName(); 
    751812        Identifiers packages = new Identifiers(); 
     
    772833        } 
    773834         
    774         members.add(wrap(imp, flags)); 
     835        Dsymbol sym = wrap(imp, flags); 
     836        members.add(sym); 
     837        return sym; 
    775838    } 
    776839     
     
    788851    } 
    789852     
    790     private LINK getLink(IInitializer init) { 
     853    public static LINK getLink(IInitializer init) { 
    791854        String name = init.getElementName(); 
    792855        if ("".equals(name) || "D".equals(name)) { 
     
    9621025     
    9631026     
    964     private Dsymbol wrap(Dsymbol symbol, IMember member) throws JavaModelException { 
     1027    public Dsymbol wrap(Dsymbol symbol, IMember member) throws JavaModelException { 
    9651028        return wrap(symbol, member.getFlags()); 
    9661029    } 
    9671030     
    968     private Dsymbol wrap(Dsymbol symbol, long flags) throws JavaModelException { 
     1031    public Dsymbol wrap(Dsymbol symbol, long flags) throws JavaModelException { 
    9691032        int stc = getStorageClass(flags);