1 11 package org.eclipse.jdt.internal.eval; 12 13 import org.eclipse.jdt.core.compiler.CharOperation; 14 import org.eclipse.jdt.core.compiler.IProblem; 15 import org.eclipse.jdt.internal.compiler.CompilationResult; 16 import org.eclipse.jdt.internal.compiler.ast.*; 17 import org.eclipse.jdt.internal.compiler.lookup.Binding; 18 import org.eclipse.jdt.internal.compiler.parser.Parser; 19 import org.eclipse.jdt.internal.compiler.problem.ProblemReporter; 20 21 24 public class CodeSnippetParser extends Parser implements EvaluationConstants { 25 int codeSnippetStart, codeSnippetEnd; 26 EvaluationContext evaluationContext; 27 boolean hasRecoveredOnExpression; 28 int lastStatement = -1; int lineSeparatorLength; 30 31 int problemCountBeforeRecovery = 0; 32 35 public CodeSnippetParser(ProblemReporter problemReporter, EvaluationContext evaluationContext, boolean optimizeStringLiterals, int codeSnippetStart, int codeSnippetEnd) { 36 super(problemReporter, optimizeStringLiterals); 37 this.codeSnippetStart = codeSnippetStart; 38 this.codeSnippetEnd = codeSnippetEnd; 39 this.evaluationContext = evaluationContext; 40 this.reportOnlyOneSyntaxError = true; 41 this.javadocParser.checkDocComment = false; 42 } 43 protected void classInstanceCreation(boolean alwaysQualified) { 44 46 49 AllocationExpression alloc; 50 int length; 51 if (((length = this.astLengthStack[this.astLengthPtr--]) == 1) 52 && (this.astStack[this.astPtr] == null)) { 53 this.astPtr--; 55 if (alwaysQualified) { 56 alloc = new QualifiedAllocationExpression(); 57 } else { 58 alloc = new CodeSnippetAllocationExpression(this.evaluationContext); 59 } 60 alloc.sourceEnd = this.endPosition; 62 if ((length = this.expressionLengthStack[this.expressionLengthPtr--]) != 0) { 63 this.expressionPtr -= length; 64 System.arraycopy( 65 this.expressionStack, 66 this.expressionPtr + 1, 67 alloc.arguments = new Expression[length], 68 0, 69 length); 70 } 71 alloc.type = getTypeReference(0); 72 alloc.sourceStart = this.intStack[this.intPtr--]; 75 pushOnExpressionStack(alloc); 76 } else { 77 dispatchDeclarationInto(length); 78 TypeDeclaration anonymousTypeDeclaration = (TypeDeclaration) this.astStack[this.astPtr]; 79 anonymousTypeDeclaration.declarationSourceEnd = this.endStatementPosition; 80 if (anonymousTypeDeclaration.allocation != null) { 81 anonymousTypeDeclaration.allocation.sourceEnd = this.endStatementPosition; 82 } 83 this.astPtr--; 84 this.astLengthPtr--; 85 86 markInitializersWithLocalType(anonymousTypeDeclaration); 88 } 89 } 90 protected void consumeClassDeclaration() { 91 super.consumeClassDeclaration(); 92 93 recordLastStatementIfNeeded(); 94 } 95 protected void consumeClassHeaderName1() { 96 TypeDeclaration typeDecl; 98 if (this.nestedMethod[this.nestedType] == 0) { 99 if (this.nestedType != 0) { 100 typeDecl = new TypeDeclaration(this.compilationUnit.compilationResult); 101 typeDecl.bits |= ASTNode.IsMemberType; 102 } else { 103 typeDecl = new CodeSnippetTypeDeclaration(this.compilationUnit.compilationResult); 104 } 105 } else { 106 typeDecl = new TypeDeclaration(this.compilationUnit.compilationResult); 108 typeDecl.bits |= ASTNode.IsLocalType; 109 markEnclosingMemberWithLocalType(); 110 blockReal(); 111 } 112 113 long pos = this.identifierPositionStack[this.identifierPtr]; 115 typeDecl.sourceEnd = (int) pos; 116 typeDecl.sourceStart = (int) (pos >>> 32); 117 typeDecl.name = this.identifierStack[this.identifierPtr--]; 118 this.identifierLengthPtr--; 119 120 typeDecl.declarationSourceStart = this.intStack[this.intPtr--]; 122 this.intPtr--; 123 typeDecl.modifiersSourceStart = this.intStack[this.intPtr--]; 125 typeDecl.modifiers = this.intStack[this.intPtr--]; 126 if (typeDecl.modifiersSourceStart >= 0) { 127 typeDecl.declarationSourceStart = typeDecl.modifiersSourceStart; 128 } 129 typeDecl.bodyStart = typeDecl.sourceEnd + 1; 130 pushOnAstStack(typeDecl); 131 132 this.listLength = 0; if (this.currentElement != null){ 135 this.lastCheckPoint = typeDecl.bodyStart; 136 this.currentElement = this.currentElement.add(typeDecl, 0); 137 this.lastIgnoredToken = -1; 138 } 139 typeDecl.javadoc = this.javadoc; 141 this.javadoc = null; 142 } 143 protected void consumeEmptyStatement() { 144 super.consumeEmptyStatement(); 145 146 recordLastStatementIfNeeded(); 147 } 148 protected void consumeEnhancedForStatement() { 149 super.consumeEnhancedForStatement(); 150 151 recordLastStatementIfNeeded(); 152 } 153 protected void consumeExpressionStatement() { 154 super.consumeExpressionStatement(); 155 156 recordLastStatementIfNeeded(); 157 } 158 protected void consumeFieldAccess(boolean isSuperAccess) { 159 162 FieldReference fr = 163 new CodeSnippetFieldReference( 164 this.identifierStack[this.identifierPtr], 165 this.identifierPositionStack[this.identifierPtr--], 166 this.evaluationContext); 167 this.identifierLengthPtr--; 168 if (isSuperAccess) { 169 fr.sourceStart = this.intStack[this.intPtr--]; 171 problemReporter().codeSnippetMissingClass(null,0, 0); 172 fr.receiver = new CodeSnippetSuperReference(fr.sourceStart, this.endPosition); 173 pushOnExpressionStack(fr); 174 } else { 175 if ((fr.receiver = this.expressionStack[this.expressionPtr]).isThis()) { 177 fr.sourceStart = fr.receiver.sourceStart; 179 } 180 this.expressionStack[this.expressionPtr] = fr; 181 } 182 } 183 protected void consumeInterfaceHeaderName1() { 184 TypeDeclaration typeDecl; 186 if (this.nestedMethod[this.nestedType] == 0) { 187 if (this.nestedType != 0) { 188 typeDecl = new TypeDeclaration(this.compilationUnit.compilationResult); 189 typeDecl.bits |= ASTNode.IsMemberType; 190 } else { 191 typeDecl = new CodeSnippetTypeDeclaration(this.compilationUnit.compilationResult); 192 } 193 } else { 194 typeDecl = new TypeDeclaration(this.compilationUnit.compilationResult); 196 typeDecl.bits |= ASTNode.IsLocalType; 197 markEnclosingMemberWithLocalType(); 198 blockReal(); 199 } 200 201 long pos = this.identifierPositionStack[this.identifierPtr]; 203 typeDecl.sourceEnd = (int) pos; 204 typeDecl.sourceStart = (int) (pos >>> 32); 205 typeDecl.name = this.identifierStack[this.identifierPtr--]; 206 this.identifierLengthPtr--; 207 208 typeDecl.declarationSourceStart = this.intStack[this.intPtr--]; 210 this.intPtr--; 211 typeDecl.modifiersSourceStart = this.intStack[this.intPtr--]; 213 typeDecl.modifiers = this.intStack[this.intPtr--]; 214 if (typeDecl.modifiersSourceStart >= 0) { 215 typeDecl.declarationSourceStart = typeDecl.modifiersSourceStart; 216 } 217 typeDecl.bodyStart = typeDecl.sourceEnd + 1; 218 pushOnAstStack(typeDecl); 219 this.listLength = 0; if (this.currentElement != null){ this.lastCheckPoint = typeDecl.bodyStart; 223 this.currentElement = this.currentElement.add(typeDecl, 0); 224 this.lastIgnoredToken = -1; 225 } 226 typeDecl.javadoc = this.javadoc; 228 this.javadoc = null; 229 } 230 protected void consumeInternalCompilationUnit() { 231 } 235 protected void consumeInternalCompilationUnitWithTypes() { 236 int length; 242 if ((length = this.astLengthStack[this.astLengthPtr--]) != 0) { 243 this.compilationUnit.types = new TypeDeclaration[length]; 244 this.astPtr -= length; 245 System.arraycopy(this.astStack, this.astPtr + 1, this.compilationUnit.types, 0, length); 246 } 247 } 248 protected void consumeLocalVariableDeclarationStatement() { 249 super.consumeLocalVariableDeclarationStatement(); 250 251 recordLastStatementIfNeeded(); 252 } 253 254 260 protected void consumeMethodDeclaration(boolean isNotAbstract) { 261 264 super.consumeMethodDeclaration(isNotAbstract); 265 266 MethodDeclaration methodDecl = (MethodDeclaration) this.astStack[this.astPtr]; 268 269 if (this.isTopLevelType()) { 272 int last = methodDecl.statements == null ? -1 : methodDecl.statements.length - 1; 273 if (last >= 0 && methodDecl.statements[last] instanceof Expression){ 274 Expression lastExpression = (Expression) methodDecl.statements[last]; 275 methodDecl.statements[last] = new CodeSnippetReturnStatement( 276 lastExpression, 277 lastExpression.sourceStart, 278 lastExpression.sourceEnd); 279 } 280 } 281 282 int start = methodDecl.bodyStart-1, end = start; 283 long position = ((long)start << 32) + end; 284 long[] positions = new long[]{position}; 285 if (this.evaluationContext.localVariableNames != null) { 286 287 int varCount = this.evaluationContext.localVariableNames.length; 289 Statement[] newStatements = new Statement[varCount+1]; 291 for (int i = 0; i < varCount; i++){ 292 char[] trimmedTypeName = this.evaluationContext.localVariableTypeNames[i]; 293 int nameEnd = CharOperation.indexOf('[', trimmedTypeName); 294 if (nameEnd >= 0) { 295 trimmedTypeName = CharOperation.subarray(trimmedTypeName, 0, nameEnd); 296 } 297 nameEnd = CharOperation.indexOf(' ', trimmedTypeName); 298 if (nameEnd >= 0) { 299 trimmedTypeName = CharOperation.subarray(trimmedTypeName, 0, nameEnd); 300 } 301 TypeReference typeReference = new QualifiedTypeReference( 302 CharOperation.splitOn('.', trimmedTypeName), 303 positions); 304 int dimCount = CharOperation.occurencesOf('[', this.evaluationContext.localVariableTypeNames[i]); 305 if (dimCount > 0) { 306 typeReference = this.copyDims(typeReference, dimCount); 307 } 308 NameReference init = new SingleNameReference( 309 CharOperation.concat(LOCAL_VAR_PREFIX, this.evaluationContext.localVariableNames[i]), position); 310 LocalDeclaration declaration = new LocalDeclaration(this.evaluationContext.localVariableNames[i], start, end); 311 declaration.initialization = init; 312 declaration.type = typeReference; 313 declaration.modifiers = this.evaluationContext.localVariableModifiers[i]; 314 newStatements[i] = declaration; 315 } 316 317 TryStatement tryStatement = new TryStatement(); 320 Block tryBlock = new Block(methodDecl.explicitDeclarations); 321 tryBlock.sourceStart = start; 322 tryBlock.sourceEnd = end; 323 tryBlock.statements = methodDecl.statements; tryStatement.tryBlock = tryBlock; 325 Block finallyBlock = new Block(0); 327 finallyBlock.sourceStart = start; 328 finallyBlock.sourceEnd = end; 329 finallyBlock.statements = new Statement[varCount]; 330 for (int i = 0; i < varCount; i++){ 331 finallyBlock.statements[i] = new Assignment( 332 new SingleNameReference(CharOperation.concat(LOCAL_VAR_PREFIX, this.evaluationContext.localVariableNames[i]), position), 333 new SingleNameReference(this.evaluationContext.localVariableNames[i], position), 334 (int) position); 335 } 336 tryStatement.finallyBlock = finallyBlock; 337 338 newStatements[varCount] = tryStatement; 339 methodDecl.statements = newStatements; 340 } 341 } 342 343 protected void consumeMethodInvocationName() { 344 346 if (this.scanner.startPosition >= this.codeSnippetStart 347 && this.scanner.startPosition <= this.codeSnippetEnd + 1 + this.lineSeparatorLength && isTopLevelType()) { 349 350 352 MessageSend m = newMessageSend(); 353 m.sourceEnd = this.rParenPos; 354 m.sourceStart = 355 (int) ((m.nameSourcePosition = this.identifierPositionStack[this.identifierPtr]) >>> 32); 356 m.selector = this.identifierStack[this.identifierPtr--]; 357 if (this.identifierLengthStack[this.identifierLengthPtr] == 1) { 358 m.receiver = new CodeSnippetThisReference(0,0,this.evaluationContext, true); 359 this.identifierLengthPtr--; 360 } else { 361 this.identifierLengthStack[this.identifierLengthPtr]--; 362 m.receiver = getUnspecifiedReference(); 363 m.sourceStart = m.receiver.sourceStart; 364 } 365 pushOnExpressionStack(m); 366 } else { 367 super.consumeMethodInvocationName(); 368 } 369 } 370 371 protected void consumeMethodInvocationSuper() { 372 374 MessageSend m = newMessageSend(); 375 m.sourceStart = this.intStack[this.intPtr--]; 376 m.sourceEnd = this.rParenPos; 377 m.nameSourcePosition = this.identifierPositionStack[this.identifierPtr]; 378 m.selector = this.identifierStack[this.identifierPtr--]; 379 this.identifierLengthPtr--; 380 m.receiver = new CodeSnippetSuperReference(m.sourceStart, this.endPosition); 381 pushOnExpressionStack(m); 382 } 383 protected void consumePrimaryNoNewArrayThis() { 384 386 if (this.scanner.startPosition >= this.codeSnippetStart 387 && this.scanner.startPosition <= this.codeSnippetEnd + 1 + this.lineSeparatorLength && isTopLevelType()) { 389 pushOnExpressionStack( 390 new CodeSnippetThisReference(this.intStack[this.intPtr--], this.endPosition, this.evaluationContext, false)); 391 } else { 392 super.consumePrimaryNoNewArrayThis(); 393 } 394 } 395 protected void consumeStatementBreak() { 396 super.consumeStatementBreak(); 397 398 recordLastStatementIfNeeded(); 399 } 400 protected void consumeStatementBreakWithLabel() { 401 super.consumeStatementBreakWithLabel(); 402 403 recordLastStatementIfNeeded(); 404 } 405 protected void consumeStatementCatch() { 406 super.consumeStatementCatch(); 407 408 recordLastStatementIfNeeded(); 409 } 410 protected void consumeStatementContinue() { 411 super.consumeStatementContinue(); 412 413 recordLastStatementIfNeeded(); 414 } 415 protected void consumeStatementContinueWithLabel() { 416 super.consumeStatementContinueWithLabel(); 417 418 recordLastStatementIfNeeded(); 419 } 420 protected void consumeStatementDo() { 421 super.consumeStatementDo(); 422 423 recordLastStatementIfNeeded(); 424 } 425 protected void consumeStatementFor() { 426 super.consumeStatementFor(); 427 428 recordLastStatementIfNeeded(); 429 } 430 protected void consumeStatementIfNoElse() { 431 super.consumeStatementIfNoElse(); 432 433 recordLastStatementIfNeeded(); 434 } 435 protected void consumeStatementIfWithElse() { 436 super.consumeStatementIfWithElse(); 437 438 recordLastStatementIfNeeded(); 439 } 440 protected void consumeStatementLabel() { 441 super.consumeStatementLabel(); 442 443 recordLastStatementIfNeeded(); 444 } 445 protected void consumeStatementReturn() { 446 448 if ((this.hasRecoveredOnExpression 451 || (this.scanner.startPosition >= this.codeSnippetStart && this.scanner.startPosition <= this.codeSnippetEnd+1+this.lineSeparatorLength )) 452 && this.expressionLengthStack[this.expressionLengthPtr] != 0 453 && isTopLevelType()) { 454 this.expressionLengthPtr--; 455 Expression expression = this.expressionStack[this.expressionPtr--]; 456 pushOnAstStack( 457 new CodeSnippetReturnStatement( 458 expression, 459 expression.sourceStart, 460 expression.sourceEnd)); 461 } else { 462 super.consumeStatementReturn(); 463 } 464 465 recordLastStatementIfNeeded(); 466 } 467 protected void consumeStatementSwitch() { 468 super.consumeStatementSwitch(); 469 470 recordLastStatementIfNeeded(); 471 } 472 protected void consumeStatementSynchronized() { 473 super.consumeStatementSynchronized(); 474 475 recordLastStatementIfNeeded(); 476 } 477 protected void consumeStatementThrow() { 478 super.consumeStatementThrow(); 479 480 recordLastStatementIfNeeded(); 481 } 482 protected void consumeStatementTry(boolean arg_0) { 483 super.consumeStatementTry(arg_0); 484 485 recordLastStatementIfNeeded(); 486 } 487 protected void consumeStatementWhile() { 488 super.consumeStatementWhile(); 489 490 recordLastStatementIfNeeded(); 491 } 492 protected CompilationUnitDeclaration endParse(int act) { 493 if (this.hasRecoveredOnExpression) { 494 CompilationResult unitResult = this.compilationUnit.compilationResult; 495 if (act != ERROR_ACTION) { for (int i = 0; i < unitResult.problemCount; i++) { 498 unitResult.problems[i] = null; } 500 unitResult.problemCount = 0; 501 if (this.referenceContext instanceof AbstractMethodDeclaration) { 502 ((AbstractMethodDeclaration)this.referenceContext).ignoreFurtherInvestigation = false; 503 } 504 if (this.referenceContext instanceof CompilationUnitDeclaration) { 505 ((CompilationUnitDeclaration)this.referenceContext).ignoreFurtherInvestigation = false; 506 } 507 508 consumeStatementReturn(); 510 int fieldsCount = 511 (this.evaluationContext.localVariableNames == null ? 0 : this.evaluationContext.localVariableNames.length) 512 + (this.evaluationContext.declaringTypeName == null ? 0 : 1); 513 if (this.astPtr > (this.diet ? 0 : 2 + fieldsCount)) { 514 consumeBlockStatements(); 518 } 519 consumeMethodBody(); 520 if (!this.diet) { 521 consumeMethodDeclaration(true); 522 if (fieldsCount > 0) { 523 consumeClassBodyDeclarations(); 524 } 525 consumeClassBodyDeclarationsopt(); 526 consumeClassDeclaration(); 527 consumeInternalCompilationUnitWithTypes(); 528 consumeCompilationUnit(); 529 } 530 this.lastAct = ACCEPT_ACTION; 531 } else { 532 int maxRegularPos = 0, problemCount = unitResult.problemCount; 537 for (int i = 0; i < this.problemCountBeforeRecovery; i++) { 538 if (unitResult.problems[i].getID() == IProblem.UnmatchedBracket) continue; 540 541 int start = unitResult.problems[i].getSourceStart(); 542 if (start > maxRegularPos && start <= this.codeSnippetEnd) { 543 maxRegularPos = start; 544 } 545 } 546 int maxRecoveryPos = 0; 547 for (int i = this.problemCountBeforeRecovery; i < problemCount; i++) { 548 if (unitResult.problems[i].getID() == IProblem.UnmatchedBracket) continue; 550 551 int start = unitResult.problems[i].getSourceStart(); 552 if (start > maxRecoveryPos && start <= this.codeSnippetEnd) { 553 maxRecoveryPos = start; 554 } 555 } 556 if (maxRecoveryPos > maxRegularPos) { 557 System.arraycopy(unitResult.problems, this.problemCountBeforeRecovery, unitResult.problems, 0, problemCount - this.problemCountBeforeRecovery); 558 unitResult.problemCount -= this.problemCountBeforeRecovery; 559 } else { 560 unitResult.problemCount -= (problemCount - this.problemCountBeforeRecovery); 561 } 562 for (int i = unitResult.problemCount; i < problemCount; i++) { 563 unitResult.problems[i] = null; } 565 566 } 567 } 568 return super.endParse(act); 569 } 570 protected NameReference getUnspecifiedReference() { 571 572 573 if (this.scanner.startPosition >= this.codeSnippetStart 574 && this.scanner.startPosition <= this.codeSnippetEnd+1+this.lineSeparatorLength ){ 575 int length; 576 NameReference ref; 577 if ((length = this.identifierLengthStack[this.identifierLengthPtr--]) == 1) { 578 ref = 580 new CodeSnippetSingleNameReference( 581 this.identifierStack[this.identifierPtr], 582 this.identifierPositionStack[this.identifierPtr--], 583 this.evaluationContext); 584 } else { 585 char[][] tokens = new char[length][]; 587 this.identifierPtr -= length; 588 System.arraycopy(this.identifierStack, this.identifierPtr + 1, tokens, 0, length); 589 long[] positions = new long[length]; 590 System.arraycopy(this.identifierPositionStack, this.identifierPtr + 1, positions, 0, length); 591 ref = 592 new CodeSnippetQualifiedNameReference(tokens, 593 positions, 594 (int) (this.identifierPositionStack[this.identifierPtr + 1] >> 32), (int) this.identifierPositionStack[this.identifierPtr + length], 596 this.evaluationContext); } 598 return ref; 599 } else { 600 return super.getUnspecifiedReference(); 601 } 602 } 603 protected NameReference getUnspecifiedReferenceOptimized() { 604 610 611 if (this.scanner.startPosition >= this.codeSnippetStart 612 && this.scanner.startPosition <= this.codeSnippetEnd+1+this.lineSeparatorLength ){ 613 int length; 614 NameReference ref; 615 if ((length = this.identifierLengthStack[this.identifierLengthPtr--]) == 1) { 616 ref = 618 new CodeSnippetSingleNameReference( 619 this.identifierStack[this.identifierPtr], 620 this.identifierPositionStack[this.identifierPtr--], 621 this.evaluationContext); 622 ref.bits &= ~ASTNode.RestrictiveFlagMASK; 623 ref.bits |= Binding.LOCAL | Binding.FIELD; 624 return ref; 625 } 626 627 633 char[][] tokens = new char[length][]; 634 this.identifierPtr -= length; 635 System.arraycopy(this.identifierStack, this.identifierPtr + 1, tokens, 0, length); 636 long[] positions = new long[length]; 637 System.arraycopy(this.identifierPositionStack, this.identifierPtr + 1, positions, 0, length); 638 ref = new CodeSnippetQualifiedNameReference( 639 tokens, 640 positions, 641 (int) (this.identifierPositionStack[this.identifierPtr + 1] >> 32), (int) this.identifierPositionStack[this.identifierPtr + length], 643 this.evaluationContext); ref.bits &= ~ASTNode.RestrictiveFlagMASK; 645 ref.bits |= Binding.LOCAL | Binding.FIELD; 646 return ref; 647 } else { 648 return super.getUnspecifiedReferenceOptimized(); 649 } 650 } 651 protected void ignoreExpressionAssignment() { 652 super.ignoreExpressionAssignment(); 653 654 recordLastStatementIfNeeded(); 655 } 656 659 private boolean isTopLevelType() { 660 return this.nestedType == (this.diet ? 0 : 1); 661 } 662 protected MessageSend newMessageSend() { 663 666 CodeSnippetMessageSend m = new CodeSnippetMessageSend(this.evaluationContext); 667 int length; 668 if ((length = this.expressionLengthStack[this.expressionLengthPtr--]) != 0) { 669 this.expressionPtr -= length; 670 System.arraycopy( 671 this.expressionStack, 672 this.expressionPtr + 1, 673 m.arguments = new Expression[length], 674 0, 675 length); 676 } 677 return m; 678 } 679 682 private void recordLastStatementIfNeeded() { 683 if ((isTopLevelType()) && (this.scanner.startPosition <= this.codeSnippetEnd+this.lineSeparatorLength )) { 684 this.lastStatement = this.scanner.startPosition; 685 } 686 } 687 688 protected void reportSyntaxErrors(boolean isDietParse, int oldFirstToken) { 689 if (!isDietParse) { 690 this.scanner.initialPosition = this.lastStatement; 691 this.scanner.eofPosition = this.codeSnippetEnd + 1; oldFirstToken = TokenNameTWIDDLE; } 694 super.reportSyntaxErrors(isDietParse, oldFirstToken); 695 } 696 700 protected boolean resumeOnSyntaxError() { 701 if (this.diet || this.hasRecoveredOnExpression) { return false; 703 } 704 705 this.problemCountBeforeRecovery = this.compilationUnit.compilationResult.problemCount; 708 709 if (this.lastStatement < 0) { 711 this.lastStatement = this.codeSnippetStart; } 713 this.scanner.initialPosition = this.lastStatement; 714 this.scanner.startPosition = this.lastStatement; 715 this.scanner.currentPosition = this.lastStatement; 716 this.scanner.eofPosition = this.codeSnippetEnd < Integer.MAX_VALUE ? this.codeSnippetEnd + 1 : this.codeSnippetEnd; this.scanner.commentPtr = -1; 718 719 this.expressionPtr = -1; 721 this.identifierPtr = -1; 722 this.identifierLengthPtr = -1; 723 724 goForExpression(); 726 this.hasRecoveredOnExpression = true; 727 this.hasReportedError = false; 728 this.hasError = false; 729 return true; 730 } 731 } 732 | Popular Tags |