Changeset 1136

Show
Ignore:
Timestamp:
04/28/08 21:13:52 (4 months ago)
Author:
asterite
Message:

Now import("file_name") expressions work, but the path of them is the same as the include path. It will be like this for the next release... I'm kind of lazy to do a sofisticated dialog to configure that.
Now autocompletion works in "mixin |" and "class Foo : |".
Cleaned up some code and some behaviour.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/descent.core/src/descent/core/dom/ASTConverter.java

    r1131 r1136  
    35933593        } 
    35943594         
    3595         for(int i = 0; i < ids.size(); i++) { 
    3596             IdentifierExp id = ids.get(i); 
    3597             if (id == null || (id.ident != null && CharOperation.equals(id.ident, Id.empty))) continue; 
    3598              
    3599             descent.core.dom.Type second; 
    3600             if (i == ids.size() - 1) { 
    3601                 if (tiargs == null || tiargs.isEmpty()) { 
    3602                     descent.core.dom.SimpleName firstName = (SimpleName) convert(id); 
    3603                     second = ast.newSimpleType(firstName); 
    3604                     second.setSourceRange(firstName.getStartPosition(), firstName.getLength()); 
     3595        if (ids != null) { 
     3596            for(int i = 0; i < ids.size(); i++) { 
     3597                IdentifierExp id = ids.get(i); 
     3598                if (id == null || (id.ident != null && CharOperation.equals(id.ident, Id.empty))) continue; 
     3599                 
     3600                descent.core.dom.Type second; 
     3601                if (i == ids.size() - 1) { 
     3602                    if (tiargs == null || tiargs.isEmpty()) { 
     3603                        descent.core.dom.SimpleName firstName = (SimpleName) convert(id); 
     3604                        second = ast.newSimpleType(firstName); 
     3605                        second.setSourceRange(firstName.getStartPosition(), firstName.getLength()); 
     3606                    } else { 
     3607                        TemplateType type = new TemplateType(ast); 
     3608                        type.setName((SimpleName) convert(id)); 
     3609                        for(ASTDmdNode node : tiargs) { 
     3610                            type.arguments().add(convert(node)); 
     3611                        } 
     3612                        second = type; 
     3613                        second.setSourceRange(id.start, start + length - id.start); 
     3614                    } 
    36053615                } else { 
    3606                     TemplateType type = new TemplateType(ast); 
    3607                     type.setName((SimpleName) convert(id)); 
    3608                     for(ASTDmdNode node : tiargs) { 
    3609                         type.arguments().add(convert(node)); 
     3616                    if (id instanceof TemplateInstanceWrapper) { 
     3617                        second = convert((TemplateInstanceWrapper) id); 
     3618                    } else { 
     3619                        descent.core.dom.SimpleName name = (SimpleName) convert(id); 
     3620                        second = ast.newSimpleType(name); 
     3621                        second.setSourceRange(name.getStartPosition(), name.getLength()); 
    36103622                    } 
    3611                     second = type; 
    3612                     second.setSourceRange(id.start, start + length - id.start); 
    3613                 } 
    3614             } else { 
    3615                 if (id instanceof TemplateInstanceWrapper) { 
    3616                     second = convert((TemplateInstanceWrapper) id); 
     3623                } 
     3624                if (ret == null) { 
     3625                    if (i == 1) { 
     3626                        ret = ast.newQualifiedType(null, second); 
     3627                    } else { 
     3628                        ret = second; 
     3629                    } 
    36173630                } else { 
    3618                     descent.core.dom.SimpleName name = (SimpleName) convert(id); 
    3619                     second = ast.newSimpleType(name); 
    3620                     second.setSourceRange(name.getStartPosition(), name.getLength()); 
    3621                 } 
    3622             } 
    3623             if (ret == null) { 
    3624                 if (i == 1) { 
    3625                     ret = ast.newQualifiedType(null, second); 
    3626                 } else { 
    3627                     ret = second; 
    3628                 } 
    3629             } else { 
    3630                 ret = ast.newQualifiedType(ret, second); 
    3631             } 
    3632             ret.setSourceRange(start, second.getStartPosition() + second.getLength() - start); 
     3631                    ret = ast.newQualifiedType(ret, second); 
     3632                } 
     3633                ret.setSourceRange(start, second.getStartPosition() + second.getLength() - start); 
     3634            } 
    36333635        } 
    36343636        return ret; 
  • trunk/descent.core/src/descent/core/dom/CompilationUnitResolver.java

    r1124 r1136  
    369369            for(IPackageFragmentRoot root : project.getAllPackageFragmentRoots()) { 
    370370                if (root.getResource() == null) { 
    371                     global.path.add(root.getPath().toOSString()); 
     371                    String path = root.getPath().toOSString(); 
     372                    global.path.add(path); 
     373                    global.filePath.add(path); 
    372374                } else { 
    373                     global.path.add(root.getResource().getLocation().toOSString()); 
     375                    String path = root.getResource().getLocation().toOSString(); 
     376                    global.path.add(path); 
     377                    global.filePath.add(path); 
    374378                } 
    375379            } 
  • trunk/descent.core/src/descent/internal/codeassist/CompletionEngine.java

    r1132 r1136  
    2424import descent.internal.codeassist.complete.CompletionOnCallExp; 
    2525import descent.internal.codeassist.complete.CompletionOnCaseStatement; 
     26import descent.internal.codeassist.complete.CompletionOnClassDeclaration; 
    2627import descent.internal.codeassist.complete.CompletionOnCompoundStatement; 
    2728import descent.internal.codeassist.complete.CompletionOnContinueStatement; 
     
    3233import descent.internal.codeassist.complete.CompletionOnIdentifierExp; 
    3334import descent.internal.codeassist.complete.CompletionOnImport; 
     35import descent.internal.codeassist.complete.CompletionOnInterfaceDeclaration; 
    3436import descent.internal.codeassist.complete.CompletionOnJavadocImpl; 
    3537import descent.internal.codeassist.complete.CompletionOnModuleDeclaration; 
    3638import descent.internal.codeassist.complete.CompletionOnNewExp; 
    3739import descent.internal.codeassist.complete.CompletionOnSuperDotExp; 
     40import descent.internal.codeassist.complete.CompletionOnTemplateMixin; 
    3841import descent.internal.codeassist.complete.CompletionOnThisDotExp; 
    3942import descent.internal.codeassist.complete.CompletionOnTypeDotIdExp; 
     
    256259    boolean wantProperties = true; 
    257260    boolean wantMethodContextInfo = false; 
    258     boolean wantKeywords = true; 
     261     
     262    Scope rootScope; 
    259263     
    260264    int INCLUDE_TYPES = 1; 
     
    381385             
    382386            // First the assist node 
    383             if (assistNode != null) { 
    384                 if (assistNode instanceof CompletionOnModuleDeclaration &&  
    385                         !requestor.isIgnored(CompletionProposal.COMPILATION_UNIT_REF)) { 
    386                     CompletionOnModuleDeclaration node = (CompletionOnModuleDeclaration) assistNode; 
    387                     completeModuleDeclaration(node); 
    388                 } else if (assistNode instanceof CompletionOnImport && 
    389                         !requestor.isIgnored(CompletionProposal.COMPILATION_UNIT_REF)) { 
    390                     CompletionOnImport node = (CompletionOnImport) assistNode; 
    391                     completeImport(node); 
    392                 } else if (assistNode instanceof CompletionOnArgumentName) { 
    393                     CompletionOnArgumentName node = (CompletionOnArgumentName) assistNode; 
    394                     completeArgumentName(node); 
    395                 } else if (assistNode instanceof CompletionOnGotoStatement) { 
    396                     CompletionOnGotoStatement node = (CompletionOnGotoStatement) assistNode; 
    397                     completeGotoBreakOrContinueStatement(node.ident, false /* don't check in loop */); 
    398                 } else if (assistNode instanceof CompletionOnBreakStatement) { 
    399                     CompletionOnBreakStatement node = (CompletionOnBreakStatement) assistNode; 
    400                     completeGotoBreakOrContinueStatement(node.ident, true /* check in loop */); 
    401                 } else if (assistNode instanceof CompletionOnContinueStatement) { 
    402                     CompletionOnContinueStatement node = (CompletionOnContinueStatement) assistNode; 
    403                     completeGotoBreakOrContinueStatement(node.ident, true /* check in loop */); 
    404                 } else if (assistNode instanceof CompletionOnVersionCondition) { 
    405                     CompletionOnVersionCondition node = (CompletionOnVersionCondition) assistNode; 
    406                     completeVersionCondition(node); 
    407                 } else if (assistNode instanceof CompletionOnDebugCondition) { 
    408                     CompletionOnDebugCondition node = (CompletionOnDebugCondition) assistNode; 
    409                     completeDebugCondition(node); 
    410                 } else if (assistNode instanceof CompletionOnCaseStatement) { 
    411                     CompletionOnCaseStatement node = (CompletionOnCaseStatement) assistNode; 
    412                     completeCaseStatement(node); 
    413                      
    414                     wantKeywords = false; 
    415                 } else if (assistNode instanceof CompletionOnTypeDotIdExp) { 
    416                     CompletionOnTypeDotIdExp node = (CompletionOnTypeDotIdExp) assistNode; 
    417                     completeTypeDotIdExp(node); 
    418                 } else if (assistNode instanceof CompletionOnDotIdExp) { 
    419                     CompletionOnDotIdExp node = (CompletionOnDotIdExp) assistNode; 
    420                     completeDotIdExp(node); 
    421                 } else if (assistNode instanceof CompletionOnTypeIdentifier) { 
    422                     CompletionOnTypeIdentifier node = (CompletionOnTypeIdentifier) assistNode; 
    423                     completeTypeIdentifier(node); 
    424                 } else if (assistNode instanceof CompletionOnExpStatement) { 
    425                     CompletionOnExpStatement node = (CompletionOnExpStatement) assistNode; 
    426                     completeExpStatement(node); 
    427                 } else if (assistNode instanceof CompletionOnIdentifierExp) { 
    428                     CompletionOnIdentifierExp node = (CompletionOnIdentifierExp) assistNode; 
    429                     completeIdentifierExp(node); 
    430                 } else if (assistNode instanceof CompletionOnThisDotExp) { 
    431                     CompletionOnThisDotExp node = (CompletionOnThisDotExp) assistNode; 
    432                     completeThisDotExp(node); 
    433                 } else if (assistNode instanceof CompletionOnSuperDotExp) { 
    434                     CompletionOnSuperDotExp node = (CompletionOnSuperDotExp) assistNode; 
    435                     completeSuperDotExp(node); 
    436                 } else if (assistNode instanceof CompletionOnCompoundStatement) { 
    437                     CompletionOnCompoundStatement node = (CompletionOnCompoundStatement) assistNode; 
    438                     completeCompoundStatement(node); 
    439                 } else if (assistNode instanceof CompletionOnCallExp) { 
    440                     CompletionOnCallExp node = (CompletionOnCallExp) assistNode; 
    441                     completeCallExp(node); 
    442                 } else if (assistNode instanceof CompletionOnNewExp) { 
    443                     CompletionOnNewExp node = (CompletionOnNewExp) assistNode; 
    444                     completeNewExp(node); 
    445                 } 
    446             } 
     387            completeNode(assistNode); 
    447388             
    448389            // For new |, don't suggest keywords or ddoc 
     
    453394            // Then the keywords 
    454395            if (!wantMethodContextInfo && 
    455                     wantKeywords && 
    456396                    parser.getKeywordCompletions() != null &&  
    457397                    !requestor.isIgnored(CompletionProposal.KEYWORD)) { 
     
    487427    } 
    488428 
     429    private void completeNode(ASTDmdNode assistNode) throws JavaModelException { 
     430        if (assistNode != null) { 
     431            if (assistNode instanceof CompletionOnModuleDeclaration &&  
     432                    !requestor.isIgnored(CompletionProposal.COMPILATION_UNIT_REF)) { 
     433                CompletionOnModuleDeclaration node = (CompletionOnModuleDeclaration) assistNode; 
     434                completeModuleDeclaration(node); 
     435            } else if (assistNode instanceof CompletionOnImport && 
     436                    !requestor.isIgnored(CompletionProposal.COMPILATION_UNIT_REF)) { 
     437                CompletionOnImport node = (CompletionOnImport) assistNode; 
     438                completeImport(node); 
     439            } else if (assistNode instanceof CompletionOnArgumentName) { 
     440                CompletionOnArgumentName node = (CompletionOnArgumentName) assistNode; 
     441                completeArgumentName(node); 
     442            } else if (assistNode instanceof CompletionOnGotoStatement) { 
     443                CompletionOnGotoStatement node = (CompletionOnGotoStatement) assistNode; 
     444                completeGotoBreakOrContinueStatement(node.ident, false /* don't check in loop */); 
     445            } else if (assistNode instanceof CompletionOnBreakStatement) { 
     446                CompletionOnBreakStatement node = (CompletionOnBreakStatement) assistNode; 
     447                completeGotoBreakOrContinueStatement(node.ident, true /* check in loop */); 
     448            } else if (assistNode instanceof CompletionOnContinueStatement) { 
     449                CompletionOnContinueStatement node = (CompletionOnContinueStatement) assistNode; 
     450                completeGotoBreakOrContinueStatement(node.ident, true /* check in loop */); 
     451            } else if (assistNode instanceof CompletionOnVersionCondition) { 
     452                CompletionOnVersionCondition node = (CompletionOnVersionCondition) assistNode; 
     453                completeVersionCondition(node); 
     454            } else if (assistNode instanceof CompletionOnDebugCondition) { 
     455                CompletionOnDebugCondition node = (CompletionOnDebugCondition) assistNode; 
     456                completeDebugCondition(node); 
     457            } else if (assistNode instanceof CompletionOnCaseStatement) { 
     458                CompletionOnCaseStatement node = (CompletionOnCaseStatement) assistNode; 
     459                completeCaseStatement(node); 
     460            } else if (assistNode instanceof CompletionOnTypeDotIdExp) { 
     461                CompletionOnTypeDotIdExp node = (CompletionOnTypeDotIdExp) assistNode; 
     462                completeTypeDotIdExp(node); 
     463            } else if (assistNode instanceof CompletionOnDotIdExp) { 
     464                CompletionOnDotIdExp node = (CompletionOnDotIdExp) assistNode; 
     465                completeDotIdExp(node); 
     466            } else if (assistNode instanceof CompletionOnTypeIdentifier) { 
     467                CompletionOnTypeIdentifier node = (CompletionOnTypeIdentifier) assistNode; 
     468                completeTypeIdentifier(node); 
     469            } else if (assistNode instanceof CompletionOnExpStatement) { 
     470                CompletionOnExpStatement node = (CompletionOnExpStatement) assistNode; 
     471                completeExpStatement(node); 
     472            } else if (assistNode instanceof CompletionOnIdentifierExp) { 
     473                CompletionOnIdentifierExp node = (CompletionOnIdentifierExp) assistNode; 
     474                completeIdentifierExp(node); 
     475            } else if (assistNode instanceof CompletionOnThisDotExp) { 
     476                CompletionOnThisDotExp node = (CompletionOnThisDotExp) assistNode; 
     477                completeThisDotExp(node); 
     478            } else if (assistNode instanceof CompletionOnSuperDotExp) { 
     479                CompletionOnSuperDotExp node = (CompletionOnSuperDotExp) assistNode; 
     480                completeSuperDotExp(node); 
     481            } else if (assistNode instanceof CompletionOnCompoundStatement) { 
     482                CompletionOnCompoundStatement node = (CompletionOnCompoundStatement) assistNode; 
     483                completeCompoundStatement(node); 
     484            } else if (assistNode instanceof CompletionOnCallExp) { 
     485                CompletionOnCallExp node = (CompletionOnCallExp) assistNode; 
     486                completeCallExp(node); 
     487            } else if (assistNode instanceof CompletionOnNewExp) { 
     488                CompletionOnNewExp node = (CompletionOnNewExp) assistNode; 
     489                completeNewExp(node); 
     490            } else if (assistNode instanceof CompletionOnTemplateMixin) { 
     491                CompletionOnTemplateMixin node = (CompletionOnTemplateMixin) assistNode; 
     492                completeTemplateMixin(node); 
     493            } else if (assistNode instanceof CompletionOnClassDeclaration) { 
     494                CompletionOnClassDeclaration node = (CompletionOnClassDeclaration) assistNode; 
     495                completeClassDeclaration(node); 
     496            } else if (assistNode instanceof CompletionOnInterfaceDeclaration) { 
     497                CompletionOnInterfaceDeclaration node = (CompletionOnInterfaceDeclaration) assistNode; 
     498                completeInterfaceDeclaration(node); 
     499            } 
     500        } 
     501    } 
     502     
    489503    private void computeExpectedType() { 
    490504        if (parser.expectedTypeNode instanceof CallExp) { 
     
    622636        doSemantic(); 
    623637         
    624         Scope scope = node.scope; 
     638        if (rootScope == null) { 
     639            rootScope = node.scope; 
     640        } 
    625641         
    626642        currentName = CharOperation.NO_CHAR; 
     
    631647         
    632648        if (parser.wantOnlyType()) { 
    633             completeScope(scope, INCLUDE_TYPES | INCLUDE_IMPORTS); 
     649            completeScope(rootScope, INCLUDE_TYPES | INCLUDE_IMPORTS); 
    634650        } else { 
    635             completeScope(scope, INCLUDE_ALL);     
     651            completeScope(rootScope, INCLUDE_ALL);     
    636652        } 
    637653    } 
     
    9901006            currentName = computePrefixAndSourceRange(node.ident); 
    9911007             
    992             Scope scope = node.scope; 
     1008            if (rootScope == null) { 
     1009                rootScope = node.scope; 
     1010            } 
    9931011             
    9941012            // Inside a function, this may be the case of: 
     
    10011019            // The parser thinks it's: somet something (a var declaration with type "somet"), 
    10021020            // so inside a function we want other things beside types 
    1003             if (scope != null && scope.func != null) { 
     1021            if (rootScope != null && rootScope.func != null) { 
    10041022                isCompletingTypeIdentifier = false; 
    10051023            } 
    10061024             
    1007             completeScope(scope, INCLUDE_ALL); 
     1025            completeScope(rootScope, INCLUDE_ALL); 
    10081026             
    10091027            // Also suggest packages 
     
    11491167        } 
    11501168         
    1151         Scope scope = node.scope; 
    1152         if (scope == null) { 
    1153             return; 
    1154         } 
    1155          
    1156         completeScope(scope, INCLUDE_ALL); 
     1169        if (rootScope == null) { 
     1170            rootScope = node.scope; 
     1171        } 
     1172         
     1173        if (rootScope == null) { 
     1174            return; 
     1175        } 
     1176         
     1177        completeScope(rootScope, INCLUDE_ALL); 
    11571178         
    11581179        // Also suggest packages 
     
    11701191            currentName = computePrefixAndSourceRange(node); 
    11711192             
    1172             Scope scope = node.scope; 
    1173             completeScope(scope, INCLUDE_ALL); 
     1193            if (rootScope == null) { 
     1194                rootScope = node.scope; 
     1195            } 
     1196             
     1197            completeScope(rootScope, INCLUDE_ALL); 
    11741198             
    11751199            // Also suggest packages 
     
    12321256        } 
    12331257    } 
    1234  
     1258     
     1259    private void completeTemplateMixin(CompletionOnTemplateMixin node) throws JavaModelException { 
     1260        doSemantic(); 
     1261         
     1262        if (node.scope != null) { 
     1263            currentName = computePrefixAndSourceRange(node.name); 
     1264             
     1265            completeScope(node.scope, INCLUDE_ALL); 
     1266        } 
     1267    } 
     1268     
     1269    private void completeClassDeclaration(CompletionOnClassDeclaration node) throws JavaModelException { 
     1270        doSemantic(); 
     1271         
     1272        completeAggregateDeclaration(node, node.theScope, node.baseClassIndex); 
     1273    } 
     1274 
     1275    private void completeInterfaceDeclaration(CompletionOnInterfaceDeclaration node) throws JavaModelException { 
     1276        doSemantic(); 
     1277         
     1278        completeAggregateDeclaration(node, node.theScope, node.baseClassIndex); 
     1279    } 
     1280     
     1281    private void completeAggregateDeclaration(ClassDeclaration node, Scope scope, int baseClassIndex) throws JavaModelException { 
     1282        if (scope != null) { 
     1283            rootScope = scope; 
     1284             
     1285            if (baseClassIndex == -1) { 
     1286                currentName = CharOperation.NO_CHAR; 
     1287                startPosition = actualCompletionPosition; 
     1288                endPosition = actualCompletionPosition; 
     1289                 
     1290                completeScope(rootScope, INCLUDE_ALL); 
     1291            } else { 
     1292                completeNode(node.baseclasses.get(baseClassIndex).type); 
     1293            } 
     1294        } 
     1295    } 
     1296     
    12351297    private void completeSuperDotExp(CompletionOnSuperDotExp node) throws JavaModelException { 
    12361298        doSemantic(); 
  • trunk/descent.core/src/descent/internal/codeassist/complete/CompletionParser.java

    r1131 r1136  
    99import descent.internal.compiler.parser.AggregateDeclaration; 
    1010import descent.internal.compiler.parser.Argument; 
     11import descent.internal.compiler.parser.BaseClass; 
    1112import descent.internal.compiler.parser.BaseClasses; 
    1213import descent.internal.compiler.parser.BreakStatement; 
     
    3334import descent.internal.compiler.parser.Module; 
    3435import descent.internal.compiler.parser.ModuleDeclaration; 
     36import descent.internal.compiler.parser.Objects; 
    3537import descent.internal.compiler.parser.Parser; 
    3638import descent.internal.compiler.parser.Statement; 
     
    3840import descent.internal.compiler.parser.SuperExp; 
    3941import descent.internal.compiler.parser.TOK; 
     42import descent.internal.compiler.parser.TemplateMixin; 
    4043import descent.internal.compiler.parser.ThisExp; 
    4144import descent.internal.compiler.parser.Token; 
     
    411414        if (caseEnd <= cursorLocation && cursorLocation <= expStart + expLength && exp != null && (exp instanceof ErrorExp ||  
    412415                (exp.getNodeType() == ASTDmdNode.IDENTIFIER_EXP))) { 
     416            wantKeywords = false; 
     417             
    413418            assistNode = new CompletionOnCaseStatement(loc, exp, statement); 
    414419            return (CaseStatement) assistNode; 
     
    453458        } 
    454459        return typeBasic; 
     460    } 
     461     
     462    @Override 
     463    protected TemplateMixin newTemplateMixin(Loc loc, IdentifierExp id, Type tqual, Identifiers idents, Objects tiargs) { 
     464        if (prevToken.ptr + prevToken.sourceLen <= cursorLocation && cursorLocation <= token.ptr) { 
     465            wantKeywords = false; 
     466             
     467            assistNode = new CompletionOnTemplateMixin(loc, id, tqual, idents, tiargs); 
     468            return (CompletionOnTemplateMixin) assistNode; 
     469        } 
     470        return super.newTemplateMixin(loc, id, tqual, idents, tiargs); 
    455471    } 
    456472     
     
    800816        // We don't want assist for an aggregate's name, but we do want it 
    801817        // for base classes 
    802         if (prevToken.ptr + prevToken.sourceLen < cursorLocation && cursorLocation <= token.ptr) { 
    803             if (prevToken.value != TOK.TOKcolon && prevToken.value != TOK.TOKcomma) { 
    804                 wantAssist = false; 
    805             } else { 
    806                 wantOnlyType = true; 
     818        if (prevToken.ptr + prevToken.sourceLen <= cursorLocation && cursorLocation <= token.ptr &&  
     819                (prevToken.value == TOK.TOKcolon || prevToken.value == TOK.TOKcomma)) { 
     820            wantOnlyType = true; 
     821             
     822            assistNode = new CompletionOnClassDeclaration(loc, id, baseClasses); 
     823            return (AggregateDeclaration) assistNode; 
     824        } 
     825         
     826        if (baseClasses != null) { 
     827            int i = 0; 
     828            for(BaseClass bc : baseClasses) { 
     829                if (bc.type != null && bc.type.start <= cursorLocation && cursorLocation <= bc.type.start + bc.type.length) { 
     830                    wantOnlyType = true; 
     831                     
     832                    assistNode = new CompletionOnClassDeclaration(loc, id, baseClasses); 
     833                    ((CompletionOnClassDeclaration) assistNode).baseClassIndex = i; 
     834                    return (AggregateDeclaration) assistNode; 
     835                } 
     836                i++; 
    807837            } 
    808838        } 
     
    815845        // We don't want assist for an aggregate's name, but we do want it 
    816846        // for base classes 
    817         if (prevToken.ptr + prevToken.sourceLen < cursorLocation && cursorLocation <= token.ptr) { 
    818             if (prevToken.value != TOK.TOKcolon && prevToken.value != TOK.TOKcomma) { 
    819                 wantAssist = false; 
    820             } else { 
    821                 wantOnlyType = true; 
     847        if (prevToken.ptr + prevToken.sourceLen <= cursorLocation && cursorLocation <= token.ptr &&  
     848                (prevToken.value == TOK.TOKcolon || prevToken.value == TOK.TOKcomma)) { 
     849            wantOnlyType = true; 
     850             
     851            assistNode = new CompletionOnInterfaceDeclaration(loc, id, baseClasses); 
     852            return (AggregateDeclaration) assistNode; 
     853        } 
     854         
     855        if (baseClasses != null) { 
     856            int i = 0; 
     857            for(BaseClass bc : baseClasses) { 
     858                if (bc.type != null && bc.type.start <= cursorLocation && cursorLocation <= bc.type.start + bc.type.length) { 
     859                    wantOnlyType = true; 
     860                     
     861                    assistNode = new CompletionOnInterfaceDeclaration(loc, id, baseClasses); 
     862                    ((CompletionOnInterfaceDeclaration) assistNode).baseClassIndex = i; 
     863                    return (AggregateDeclaration) assistNode; 
     864                } 
     865                i++; 
    822866            } 
    823867        } 
  • trunk/descent.core/src/descent/internal/compiler/parser/Dsymbol.java

    r1126 r1136  
    627627     * is resolved. 
    628628     */ 
    629     public final long getFlags() { 
     629    public long getFlags() { 
    630630        long flags = 0; 
    631631        long storage_class = getStorageClass(); 
  • trunk/descent.core/src/descent/internal/compiler/parser/EnumDeclaration.java

    r1135 r1136  
    44 
    55import melnorme.miscutil.tree.TreeVisitor; 
     6import descent.core.Flags; 
    67import descent.core.IType; 
    78import descent.core.compiler.IProblem; 
     
    399400        } 
    400401    } 
     402     
     403    @Override 
     404    public long getFlags() { 
     405        return super.getFlags() | Flags.AccEnum; 
     406    } 
    401407 
    402408} 
  • trunk/descent.core/src/descent/internal/compiler/parser/FileExp.java

    r887 r1136  
    6767         
    6868        String filename = new String(((StringExp) e1).string); 
    69         File file = context.fileImports.get(filename); 
    7069         
    71         if(null == file) 
    72        
    73             context.acceptProblem(Problem.newSemanticTypeError( 
    74                    IProblem.FileImportsMustBeSpecified, 
    75                    e1, 
    76                    new String[] { filename }))
    77            return (new StringExp(loc, Id.empty, 0)).semantic(sc, context); 
     70        File file = null; 
     71        for(String filePath : context.global.filePath)
     72            File aFile = new File(filePath, filename); 
     73            if (aFile.exists()) { 
     74                file = aFile; 
     75                break
     76           } 
    7877        } 
    7978         
    80         if(!file.exists()) 
     79        // TODO remove this error? 
     80//      if(null == file) 
     81//      { 
     82//          context.acceptProblem(Problem.newSemanticTypeError( 
     83//                  IProblem.FileImportsMustBeSpecified, 
     84//                  e1, 
     85//                  new String[] { filename })); 
     86//          return (new StringExp(loc, Id.empty, 0)).semantic(sc, context); 
     87//      } 
     88         
     89        if(file == null) 
    8190        { 
    8291            context.acceptProblem(Problem.newSemanticTypeError( 
    8392                    IProblem.FileNotFound, 
    8493                    e1, 
    85                     new String[] { file.getAbsolutePath() })); 
     94                    new String[] { filename })); 
    8695            return (new StringExp(loc, Id.empty, 0)).semantic(sc, context); 
    8796        } 
  • trunk/descent.core/src/descent/internal/compiler/parser/Global.java

    r1117 r1136  
    1111    public long debugLevel; 
    1212    public Array<String> path = new Array<String>(); 
     13    public Array<String> filePath = new Array<String>(); 
    1314     
    1415    public Global() { 
  • trunk/descent.core/src/descent/internal/compiler/parser/InterfaceDeclaration.java

    r1117 r1136  
    55import org.eclipse.core.runtime.Assert; 
    66 
     7import descent.core.Flags; 
    78import descent.core.compiler.IProblem; 
    89import descent.internal.compiler.parser.ast.IASTVisitor; 
     
    320321        } 
    321322    } 
     323     
     324    @Override 
     325    public long getFlags() { 
     326        return super.getFlags() | Flags.AccInterface; 
     327    } 
    322328 
    323329} 
  • trunk/descent.core/src/descent/internal/compiler/parser/Parser.java

    r1133 r1136  
    18301830                String word = toWord(firstToken.value.toString()); 
    18311831                parsingErrorInsertToComplete(prevToken,  word + "Body", word + "Declaration"); 
    1832                 switch(firstToken.value) { 
    1833                 case TOKclass: 
    1834                     a = newClassDeclaration(loc(), id, baseClasses); 
    1835                     break; 
    1836                 case TOKinterface: 
    1837                     a = newInterfaceDeclaration(loc(), id, baseClasses); 
    1838                     break; 
    1839                 case TOKstruct: 
    1840                     a = newStructDeclaration(loc(), id); 
    1841                     break; 
    1842                 case TOKunion: 
    1843                     a = newUnionDeclaration(loc(), id); 
    1844                     break; 
     1832                 
     1833                if (a == null) { 
     1834                    switch(firstToken.value) { 
     1835                    case TOKclass: 
     1836                        a = newClassDeclaration(loc(), id, baseClasses); 
     1837                        break; 
     1838                    case TOKinterface: 
     1839                        a = newInterfaceDeclaration(loc(), id, baseClasses); 
     1840                        break; 
     1841                    case TOKstruct: 
     1842                        a = newStructDeclaration(loc(), id); 
     1843                        break; 
     1844                    case TOKunion: 
     1845                        a = newUnionDeclaration(loc(), id); 
     1846                        break; 
     1847                    } 
    18451848                } 
    18461849            }        
     
    21582161            if (token.value != TOKidentifier) { 
    21592162                parsingErrorDeleteToken(prevToken); 
     2163                 
    21602164                // goto Lerr; 
    2161                 return null
     2165                return newTemplateMixin(loc(), null, null, null, null)
    21622166            } 
    21632167            id = newIdentifierExp(); 
     
    22072211        } 
    22082212         
    2209         tm = new TemplateMixin(loc(), id, tqual, idents, tiargs); 
     2213        tm = newTemplateMixin(loc(), id, tqual, idents, tiargs); 
    22102214        tm.setTypeSourceRange(typeStart, typeLength); 
    22112215 
     
    22212225        // Lerr: 
    22222226        // return NULL; 
    2223     } 
     2227    }   
    22242228 
    22252229    @SuppressWarnings("unchecked") 
     
    74047408    } 
    74057409     
     7410    protected TemplateMixin newTemplateMixin(Loc loc, IdentifierExp id, Type tqual, Identifiers idents, Objects tiargs) { 
     7411        return new TemplateMixin(loc(), id, tqual, idents, tiargs); 
     7412    } 
     7413     
    74067414    private Statement dietParseStatement(FuncDeclaration f) { 
    74077415        if (diet) { 
  • trunk/descent.core/src/descent/internal/compiler/parser/StructDeclaration.java

    r1104 r1136  
    77import org.eclipse.core.runtime.Assert; 
    88 
     9import descent.core.Flags; 
    910import descent.core.compiler.IProblem; 
    1011import descent.internal.compiler.parser.ast.IASTVisitor; 
     
    335336        } 
    336337    } 
     338     
     339    @Override 
     340    public long getFlags() { 
     341        return super.getFlags() | Flags.AccStruct; 
     342    } 
    337343 
    338344} 
  • trunk/descent.core/src/descent/internal/compiler/parser/TemplateMixin.java

    r1124 r1136  
    2121    public TemplateMixin(Loc loc, IdentifierExp ident, Type tqual, 
    2222            Identifiers idents, Objects tiargs) { 
    23         super(loc, idents.get(idents.size() - 1)); 
     23        super(loc, idents == null || idents.isEmpty() ? null : idents.get(idents.size() - 1)); 
    2424        this.ident = ident; 
    2525        this.sourceIdent = ident; 
     
    9595            int i; 
    9696            IdentifierExp id; 
     97             
     98            // Descent: recovery on "mixin" 
     99            if (idents == null) { 
     100                return; 
     101            } 
    97102 
    98103            if (tqual != null) { 
  • trunk/descent.core/src/descent/internal/compiler/parser/UnionDeclaration.java

    r1104 r1136  
    22 
    33import melnorme.miscutil.tree.TreeVisitor; 
     4import descent.core.Flags; 
    45import descent.internal.compiler.parser.ast.IASTVisitor; 
    56 
     
    8283        } 
    8384    } 
     85     
     86    @Override 
     87    public long getFlags() { 
     88        return (super.getFlags() | Flags.AccUnion) - Flags.AccStruct; 
     89    } 
    8490 
    8591} 
  • trunk/descent.core/src/descent/internal/compiler/parser/ast/NaiveASTFlattener.java

    r1117 r1136  
    24612461        } 
    24622462         
    2463         for(int i = 0; i < ids.size(); i++) { 
    2464             IdentifierExp id = ids.get(i); 
    2465             if (id == null || (id.ident != null && CharOperation.equals(id.ident, Id.empty))) continue; 
    2466              
    2467             if (!ret) { 
    2468                 if (i == 1) { 
     2463        if (ids != null) { 
     2464            for(int i = 0; i < ids.size(); i++) { 
     2465                IdentifierExp id = ids.get(i); 
     2466                if (id == null || (id.ident != null && CharOperation.equals(id.ident, Id.empty))) continue; 
     2467                 
     2468                if (!ret) { 
     2469                    if (i == 1) { 
     2470                        this.buffer.append("."); 
     2471                    } else { 
     2472                         
     2473                    } 
     2474                } else { 
    24692475                    this.buffer.append(".");