Changeset 1136
- Timestamp:
- 04/28/08 21:13:52 (4 months ago)
- Files:
-
- trunk/descent.core/src/descent/core/dom/ASTConverter.java (modified) (1 diff)
- trunk/descent.core/src/descent/core/dom/CompilationUnitResolver.java (modified) (1 diff)
- trunk/descent.core/src/descent/internal/codeassist/CompletionEngine.java (modified) (13 diffs)
- trunk/descent.core/src/descent/internal/codeassist/complete/CompletionOnClassDeclaration.java (added)
- trunk/descent.core/src/descent/internal/codeassist/complete/CompletionOnInterfaceDeclaration.java (added)
- trunk/descent.core/src/descent/internal/codeassist/complete/CompletionOnTemplateMixin.java (added)
- trunk/descent.core/src/descent/internal/codeassist/complete/CompletionParser.java (modified) (7 diffs)
- trunk/descent.core/src/descent/internal/compiler/parser/Dsymbol.java (modified) (1 diff)
- trunk/descent.core/src/descent/internal/compiler/parser/EnumDeclaration.java (modified) (2 diffs)
- trunk/descent.core/src/descent/internal/compiler/parser/FileExp.java (modified) (1 diff)
- trunk/descent.core/src/descent/internal/compiler/parser/Global.java (modified) (1 diff)
- trunk/descent.core/src/descent/internal/compiler/parser/InterfaceDeclaration.java (modified) (2 diffs)
- trunk/descent.core/src/descent/internal/compiler/parser/Parser.java (modified) (5 diffs)
- trunk/descent.core/src/descent/internal/compiler/parser/StructDeclaration.java (modified) (2 diffs)
- trunk/descent.core/src/descent/internal/compiler/parser/TemplateMixin.java (modified) (2 diffs)
- trunk/descent.core/src/descent/internal/compiler/parser/UnionDeclaration.java (modified) (2 diffs)
- trunk/descent.core/src/descent/internal/compiler/parser/ast/NaiveASTFlattener.java (modified) (1 diff)
- trunk/descent.ui/src/descent/internal/ui/text/java/GenericJavaTypeProposal.java (modified) (1 diff)
- trunk/descent.ui/src/descent/internal/ui/text/java/LazyJavaMethodCompletionProposal.java (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/descent.core/src/descent/core/dom/ASTConverter.java
r1131 r1136 3593 3593 } 3594 3594 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 } 3605 3615 } 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()); 3610 3622 } 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 } 3617 3630 } 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 } 3633 3635 } 3634 3636 return ret; trunk/descent.core/src/descent/core/dom/CompilationUnitResolver.java
r1124 r1136 369 369 for(IPackageFragmentRoot root : project.getAllPackageFragmentRoots()) { 370 370 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); 372 374 } 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); 374 378 } 375 379 } trunk/descent.core/src/descent/internal/codeassist/CompletionEngine.java
r1132 r1136 24 24 import descent.internal.codeassist.complete.CompletionOnCallExp; 25 25 import descent.internal.codeassist.complete.CompletionOnCaseStatement; 26 import descent.internal.codeassist.complete.CompletionOnClassDeclaration; 26 27 import descent.internal.codeassist.complete.CompletionOnCompoundStatement; 27 28 import descent.internal.codeassist.complete.CompletionOnContinueStatement; … … 32 33 import descent.internal.codeassist.complete.CompletionOnIdentifierExp; 33 34 import descent.internal.codeassist.complete.CompletionOnImport; 35 import descent.internal.codeassist.complete.CompletionOnInterfaceDeclaration; 34 36 import descent.internal.codeassist.complete.CompletionOnJavadocImpl; 35 37 import descent.internal.codeassist.complete.CompletionOnModuleDeclaration; 36 38 import descent.internal.codeassist.complete.CompletionOnNewExp; 37 39 import descent.internal.codeassist.complete.CompletionOnSuperDotExp; 40 import descent.internal.codeassist.complete.CompletionOnTemplateMixin; 38 41 import descent.internal.codeassist.complete.CompletionOnThisDotExp; 39 42 import descent.internal.codeassist.complete.CompletionOnTypeDotIdExp; … … 256 259 boolean wantProperties = true; 257 260 boolean wantMethodContextInfo = false; 258 boolean wantKeywords = true; 261 262 Scope rootScope; 259 263 260 264 int INCLUDE_TYPES = 1; … … 381 385 382 386 // 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); 447 388 448 389 // For new |, don't suggest keywords or ddoc … … 453 394 // Then the keywords 454 395 if (!wantMethodContextInfo && 455 wantKeywords &&456 396 parser.getKeywordCompletions() != null && 457 397 !requestor.isIgnored(CompletionProposal.KEYWORD)) { … … 487 427 } 488 428 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 489 503 private void computeExpectedType() { 490 504 if (parser.expectedTypeNode instanceof CallExp) { … … 622 636 doSemantic(); 623 637 624 Scope scope = node.scope; 638 if (rootScope == null) { 639 rootScope = node.scope; 640 } 625 641 626 642 currentName = CharOperation.NO_CHAR; … … 631 647 632 648 if (parser.wantOnlyType()) { 633 completeScope( scope, INCLUDE_TYPES | INCLUDE_IMPORTS);649 completeScope(rootScope, INCLUDE_TYPES | INCLUDE_IMPORTS); 634 650 } else { 635 completeScope( scope, INCLUDE_ALL);651 completeScope(rootScope, INCLUDE_ALL); 636 652 } 637 653 } … … 990 1006 currentName = computePrefixAndSourceRange(node.ident); 991 1007 992 Scope scope = node.scope; 1008 if (rootScope == null) { 1009 rootScope = node.scope; 1010 } 993 1011 994 1012 // Inside a function, this may be the case of: … … 1001 1019 // The parser thinks it's: somet something (a var declaration with type "somet"), 1002 1020 // so inside a function we want other things beside types 1003 if ( scope != null && scope.func != null) {1021 if (rootScope != null && rootScope.func != null) { 1004 1022 isCompletingTypeIdentifier = false; 1005 1023 } 1006 1024 1007 completeScope( scope, INCLUDE_ALL);1025 completeScope(rootScope, INCLUDE_ALL); 1008 1026 1009 1027 // Also suggest packages … … 1149 1167 } 1150 1168 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); 1157 1178 1158 1179 // Also suggest packages … … 1170 1191 currentName = computePrefixAndSourceRange(node); 1171 1192 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); 1174 1198 1175 1199 // Also suggest packages … … 1232 1256 } 1233 1257 } 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 1235 1297 private void completeSuperDotExp(CompletionOnSuperDotExp node) throws JavaModelException { 1236 1298 doSemantic(); trunk/descent.core/src/descent/internal/codeassist/complete/CompletionParser.java
r1131 r1136 9 9 import descent.internal.compiler.parser.AggregateDeclaration; 10 10 import descent.internal.compiler.parser.Argument; 11 import descent.internal.compiler.parser.BaseClass; 11 12 import descent.internal.compiler.parser.BaseClasses; 12 13 import descent.internal.compiler.parser.BreakStatement; … … 33 34 import descent.internal.compiler.parser.Module; 34 35 import descent.internal.compiler.parser.ModuleDeclaration; 36 import descent.internal.compiler.parser.Objects; 35 37 import descent.internal.compiler.parser.Parser; 36 38 import descent.internal.compiler.parser.Statement; … … 38 40 import descent.internal.compiler.parser.SuperExp; 39 41 import descent.internal.compiler.parser.TOK; 42 import descent.internal.compiler.parser.TemplateMixin; 40 43 import descent.internal.compiler.parser.ThisExp; 41 44 import descent.internal.compiler.parser.Token; … … 411 414 if (caseEnd <= cursorLocation && cursorLocation <= expStart + expLength && exp != null && (exp instanceof ErrorExp || 412 415 (exp.getNodeType() == ASTDmdNode.IDENTIFIER_EXP))) { 416 wantKeywords = false; 417 413 418 assistNode = new CompletionOnCaseStatement(loc, exp, statement); 414 419 return (CaseStatement) assistNode; … … 453 458 } 454 459 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); 455 471 } 456 472 … … 800 816 // We don't want assist for an aggregate's name, but we do want it 801 817 // 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++; 807 837 } 808 838 } … … 815 845 // We don't want assist for an aggregate's name, but we do want it 816 846 // 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++; 822 866 } 823 867 } trunk/descent.core/src/descent/internal/compiler/parser/Dsymbol.java
r1126 r1136 627 627 * is resolved. 628 628 */ 629 public finallong getFlags() {629 public long getFlags() { 630 630 long flags = 0; 631 631 long storage_class = getStorageClass(); trunk/descent.core/src/descent/internal/compiler/parser/EnumDeclaration.java
r1135 r1136 4 4 5 5 import melnorme.miscutil.tree.TreeVisitor; 6 import descent.core.Flags; 6 7 import descent.core.IType; 7 8 import descent.core.compiler.IProblem; … … 399 400 } 400 401 } 402 403 @Override 404 public long getFlags() { 405 return super.getFlags() | Flags.AccEnum; 406 } 401 407 402 408 } trunk/descent.core/src/descent/internal/compiler/parser/FileExp.java
r887 r1136 67 67 68 68 String filename = new String(((StringExp) e1).string); 69 File file = context.fileImports.get(filename);70 69 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 } 78 77 } 79 78 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) 81 90 { 82 91 context.acceptProblem(Problem.newSemanticTypeError( 83 92 IProblem.FileNotFound, 84 93 e1, 85 new String[] { file .getAbsolutePath()}));94 new String[] { filename })); 86 95 return (new StringExp(loc, Id.empty, 0)).semantic(sc, context); 87 96 } trunk/descent.core/src/descent/internal/compiler/parser/Global.java
r1117 r1136 11 11 public long debugLevel; 12 12 public Array<String> path = new Array<String>(); 13 public Array<String> filePath = new Array<String>(); 13 14 14 15 public Global() { trunk/descent.core/src/descent/internal/compiler/parser/InterfaceDeclaration.java
r1117 r1136 5 5 import org.eclipse.core.runtime.Assert; 6 6 7 import descent.core.Flags; 7 8 import descent.core.compiler.IProblem; 8 9 import descent.internal.compiler.parser.ast.IASTVisitor; … … 320 321 } 321 322 } 323 324 @Override 325 public long getFlags() { 326 return super.getFlags() | Flags.AccInterface; 327 } 322 328 323 329 } trunk/descent.core/src/descent/internal/compiler/parser/Parser.java
r1133 r1136 1830 1830 String word = toWord(firstToken.value.toString()); 1831 1831 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 } 1845 1848 } 1846 1849 } … … 2158 2161 if (token.value != TOKidentifier) { 2159 2162 parsingErrorDeleteToken(prevToken); 2163 2160 2164 // goto Lerr; 2161 return n ull;2165 return newTemplateMixin(loc(), null, null, null, null); 2162 2166 } 2163 2167 id = newIdentifierExp(); … … 2207 2211 } 2208 2212 2209 tm = new TemplateMixin(loc(), id, tqual, idents, tiargs);2213 tm = newTemplateMixin(loc(), id, tqual, idents, tiargs); 2210 2214 tm.setTypeSourceRange(typeStart, typeLength); 2211 2215 … … 2221 2225 // Lerr: 2222 2226 // return NULL; 2223 } 2227 } 2224 2228 2225 2229 @SuppressWarnings("unchecked") … … 7404 7408 } 7405 7409 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 7406 7414 private Statement dietParseStatement(FuncDeclaration f) { 7407 7415 if (diet) { trunk/descent.core/src/descent/internal/compiler/parser/StructDeclaration.java
r1104 r1136 7 7 import org.eclipse.core.runtime.Assert; 8 8 9 import descent.core.Flags; 9 10 import descent.core.compiler.IProblem; 10 11 import descent.internal.compiler.parser.ast.IASTVisitor; … … 335 336 } 336 337 } 338 339 @Override 340 public long getFlags() { 341 return super.getFlags() | Flags.AccStruct; 342 } 337 343 338 344 } trunk/descent.core/src/descent/internal/compiler/parser/TemplateMixin.java
r1124 r1136 21 21 public TemplateMixin(Loc loc, IdentifierExp ident, Type tqual, 22 22 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)); 24 24 this.ident = ident; 25 25 this.sourceIdent = ident; … … 95 95 int i; 96 96 IdentifierExp id; 97 98 // Descent: recovery on "mixin" 99 if (idents == null) { 100 return; 101 } 97 102 98 103 if (tqual != null) { trunk/descent.core/src/descent/internal/compiler/parser/UnionDeclaration.java
r1104 r1136 2 2 3 3 import melnorme.miscutil.tree.TreeVisitor; 4 import descent.core.Flags; 4 5 import descent.internal.compiler.parser.ast.IASTVisitor; 5 6 … … 82 83 } 83 84 } 85 86 @Override 87 public long getFlags() { 88 return (super.getFlags() | Flags.AccUnion) - Flags.AccStruct; 89 } 84 90 85 91 } trunk/descent.core/src/descent/internal/compiler/parser/ast/NaiveASTFlattener.java
r1117 r1136 2461 2461 } 2462 2462 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 { 2469 2475 this.buffer.append(".");
