Changeset 860
- Timestamp:
- 10/21/07 16:17:30 (1 year ago)
- Files:
-
- trunk/descent.core/src/descent/internal/codeassist/CompletionEngine.java (modified) (7 diffs)
- trunk/descent.core/src/descent/internal/codeassist/complete/CompletionOnGotoStatement.java (added)
- trunk/descent.core/src/descent/internal/codeassist/complete/CompletionParser.java (modified) (2 diffs)
- trunk/descent.core/src/descent/internal/compiler/parser/DsymbolTable.java (modified) (2 diffs)
- trunk/descent.core/src/descent/internal/compiler/parser/GotoStatement.java (modified) (2 diffs)
- trunk/descent.core/src/descent/internal/compiler/parser/HashtableOfCharArrayAndObject.java (modified) (1 diff)
- trunk/descent.core/src/descent/internal/compiler/parser/Parser.java (modified) (2 diffs)
- trunk/descent.core/src/descent/internal/compiler/parser/SemanticContext.java (modified) (1 diff)
- trunk/descent.tests/descent/tests/assist/CompletionOnGotoStatement_Test.java (added)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/descent.core/src/descent/internal/codeassist/CompletionEngine.java
r858 r860 6 6 import descent.core.CompletionProposal; 7 7 import descent.core.CompletionRequestor; 8 import descent.core.IJavaElement; 8 9 import descent.core.IJavaProject; 10 import descent.core.IPackageFragmentRoot; 11 import descent.core.JavaModelException; 9 12 import descent.core.compiler.CharOperation; 10 13 import descent.core.dom.AST; 11 14 import descent.internal.codeassist.complete.CompletionOnArgumentName; 15 import descent.internal.codeassist.complete.CompletionOnGotoStatement; 12 16 import descent.internal.codeassist.complete.CompletionOnImport; 13 17 import descent.internal.codeassist.complete.CompletionOnModuleDeclaration; … … 19 23 import descent.internal.compiler.parser.ASTDmdNode; 20 24 import descent.internal.compiler.parser.Argument; 25 import descent.internal.compiler.parser.DsymbolTable; 26 import descent.internal.compiler.parser.Global; 27 import descent.internal.compiler.parser.Module; 28 import descent.internal.compiler.parser.SemanticContext; 21 29 import descent.internal.compiler.parser.Type; 22 30 import descent.internal.compiler.parser.TypeFunction; … … 40 48 CompletionParser parser; 41 49 CompletionRequestor requestor; 50 51 Module module; 42 52 43 53 char[] fileName = null; … … 124 134 125 135 CompletionParser parser = new CompletionParser(AST.D2, source); 136 parser.filename = this.fileName; 126 137 parser.cursorLocation = completionPosition; 127 138 128 parser.parseModuleObj();139 this.module = parser.parseModuleObj(); 129 140 ASTDmdNode assistNode = parser.getAssistNode(); 130 141 … … 142 153 CompletionOnArgumentName node = (CompletionOnArgumentName) assistNode; 143 154 completeArgumentName(node); 155 } else if (assistNode instanceof CompletionOnGotoStatement) { 156 CompletionOnGotoStatement node = (CompletionOnGotoStatement) assistNode; 157 completeGotoStatement(node); 144 158 } 145 159 } … … 159 173 } 160 174 } 161 175 176 private void doSemantic(Module module) { 177 Global global = new Global(); 178 179 IPackageFragmentRoot[] roots; 180 try { 181 roots = this.javaProject.getAllPackageFragmentRoots(); 182 for(IPackageFragmentRoot root : roots) { 183 if (root.getResource() == null) { 184 global.path.add(root.getPath().toOSString()); 185 } else { 186 global.path.add(root.getResource().getLocation().toOSString()); 187 } 188 } 189 } catch (JavaModelException e) { 190 } 191 192 SemanticContext context = new SemanticContext(null, module, global); 193 module.semantic(context); 194 } 195 162 196 private void completeModuleDeclaration(CompletionOnModuleDeclaration node) { 163 197 char[] fqn = node.getFQN(); … … 212 246 213 247 findVariableNames(name, node.type, findExcludedNames(node)); 248 } 249 250 private void completeGotoStatement(CompletionOnGotoStatement node) { 251 // TODO: a full semantic pass is not needed: optimize 252 doSemantic(this.module); 253 254 DsymbolTable table = node.fd.labtab; 255 if (table == null) { 256 return; 257 } 258 259 char[][] labels = table.keys(); 260 if (labels != null) { 261 char[] prefix; 262 if (node.ident == null || node.ident.ident == null) { 263 this.startPosition = this.actualCompletionPosition; 264 this.endPosition = this.actualCompletionPosition; 265 prefix = CharOperation.NO_CHAR; 266 } else { 267 this.startPosition = node.ident.start; 268 this.endPosition = node.ident.start + node.ident.length; 269 prefix = node.ident.ident; 270 } 271 272 for(char[] label : labels) { 273 if (label != null) { 274 if (CharOperation.prefixEquals(prefix, label, false) && !CharOperation.equals(prefix, label)) { 275 CompletionProposal proposal = this.createProposal(CompletionProposal.LABEL_REF, this.actualCompletionPosition); 276 proposal.setName(label); 277 proposal.setCompletion(label); 278 proposal.setReplaceRange(this.startPosition - this.offset, this.endPosition - this.offset); 279 CompletionEngine.this.requestor.accept(proposal); 280 } 281 } 282 } 283 } 214 284 } 215 285 trunk/descent.core/src/descent/internal/codeassist/complete/CompletionParser.java
r858 r860 9 9 import descent.internal.compiler.parser.Chars; 10 10 import descent.internal.compiler.parser.Expression; 11 import descent.internal.compiler.parser.GotoStatement; 11 12 import descent.internal.compiler.parser.IdentifierExp; 12 13 import descent.internal.compiler.parser.Identifiers; … … 81 82 82 83 @Override 84 protected GotoStatement newGotoStatement(Loc loc, IdentifierExp ident) { 85 if (prevToken.ptr + prevToken.sourceLen <= cursorLocation && cursorLocation <= token.ptr 86 && prevToken.value != TOK.TOKdot && prevToken.value != TOK.TOKslice && prevToken.value != TOK.TOKdotdotdot) { 87 88 includeExpectations = false; 89 90 assistNode = new CompletionOnGotoStatement(loc, ident); 91 return (GotoStatement) assistNode; 92 } else { 93 return super.newGotoStatement(loc, ident); 94 } 95 } 96 97 @Override 83 98 protected void expect(char[][] toks) { 84 99 // If we are completing already a more important thing, exclude trunk/descent.core/src/descent/internal/compiler/parser/DsymbolTable.java
r836 r860 1 1 package descent.internal.compiler.parser; 2 2 3 3 4 // DMD 1.020 … … 26 27 } 27 28 29 /** 30 * Note: null entries may be present in the returned array. 31 */ 32 public char[][] keys() { 33 return map.keys(); 34 } 35 28 36 @Override 29 37 public String toString() { trunk/descent.core/src/descent/internal/compiler/parser/GotoStatement.java
r840 r860 11 11 public LabelDsymbol label; 12 12 public TryFinallyStatement tf; 13 14 public FuncDeclaration fd; // descent: The parent function declaration after the first semantic pass is done 13 15 14 16 public GotoStatement(Loc loc, IdentifierExp ident) { … … 57 59 public Statement semantic(Scope sc, SemanticContext context) { 58 60 FuncDeclaration fd = sc.parent.isFuncDeclaration(); 59 61 this.fd = fd; // descent 60 62 tf = sc.tf; 63 64 if (ident == null) { 65 // It's a broken node, it has already syntax errors, 66 // but assign fd and tf first 67 return this; 68 } 69 61 70 label = fd.searchLabel(ident); 62 71 if (null == label.statement && sc.fes != null) { trunk/descent.core/src/descent/internal/compiler/parser/HashtableOfCharArrayAndObject.java
r768 r860 126 126 return elementSize; 127 127 } 128 129 public char[][] keys() { 130 return keyTable; 131 } 128 132 129 133 @Override trunk/descent.core/src/descent/internal/compiler/parser/Parser.java
r858 r860 4237 4237 } 4238 4238 4239 s = new GotoStatement(loc, ident);4239 s = newGotoStatement(loc, ident); 4240 4240 } 4241 4241 check(TOKsemicolon); … … 6962 6962 } 6963 6963 6964 protected GotoStatement newGotoStatement(Loc loc, IdentifierExp ident) { 6965 return new GotoStatement(loc, ident); 6966 } 6967 6964 6968 /** 6965 6969 * The parser expects the current token to be trunk/descent.core/src/descent/internal/compiler/parser/SemanticContext.java
r857 r860 113 113 public void acceptProblem(IProblem problem) { 114 114 // System.out.println(problem); 115 if (global.gag == 0 && muteProblems == 0 ) {115 if (global.gag == 0 && muteProblems == 0 && problemRequestor != null) { 116 116 problemRequestor.acceptProblem(problem); 117 117 }
