1 /*********************************************************************************************************************************** 2 * Copyright (c) 2000, 2003 IBM Corporation and others. All rights reserved. This program and the accompanying materials are made 3 * available under the terms of the Common Public License v1.0 which accompanies this distribution, and is available at 4 * http://www.eclipse.org/legal/cpl-v10.html 5 * 6 * Contributors: IBM Corporation - initial API and implementation 7 **********************************************************************************************************************************/ 8 package net.sourceforge.phpdt.internal.compiler; 9 10 import net.sourceforge.phpdt.core.compiler.IProblem; 11 import net.sourceforge.phpdt.internal.compiler.ast.CompilationUnitDeclaration; 12 import net.sourceforge.phpdt.internal.compiler.env.ICompilationUnit; 13 import net.sourceforge.phpdt.internal.compiler.impl.CompilerOptions; 14 import net.sourceforge.phpdt.internal.compiler.parser.UnitParser; 15 import net.sourceforge.phpdt.internal.compiler.problem.AbortCompilation; 16 import net.sourceforge.phpdt.internal.compiler.problem.ProblemReporter; 17 18 /* 19 * A document element parser extracts structural information from a piece of 20 * source, providing detailed source positions info. 21 * 22 * also see @IDocumentElementRequestor 23 * 24 * The structural investigation includes: - the package statement - import 25 * statements - top-level types: package member, member types (member types of 26 * member types...) - fields - methods 27 * 28 * Any (parsing) problem encountered is also provided. 29 */ 30 public class DocumentElementParser extends UnitParser { 31 IDocumentElementRequestor requestor; 32 33 private int localIntPtr; 34 35 private int lastFieldEndPosition; 36 37 private int lastFieldBodyEndPosition; 38 39 private int typeStartPosition; 40 41 private long selectorSourcePositions; 42 43 private int typeDims; 44 45 private int extendsDim; 46 47 private int declarationSourceStart; 48 49 /* int[] stack for storing javadoc positions */ 50 int[][] intArrayStack; 51 52 int intArrayPtr; 53 54 // CompilerOptions options; 55 DocumentElementParser(final IDocumentElementRequestor requestor, IProblemFactory problemFactory, CompilerOptions options)56 public DocumentElementParser(final IDocumentElementRequestor requestor, 57 IProblemFactory problemFactory, CompilerOptions options) { 58 super(new ProblemReporter(DefaultErrorHandlingPolicies 59 .exitAfterAllProblems(), options, problemFactory) { 60 public void record(IProblem problem, CompilationResult unitResult) { 61 requestor.acceptProblem(problem); 62 } 63 }); 64 // false, 65 // options.sourceLevel >= CompilerOptions.JDK1_4); 66 this.requestor = requestor; 67 intArrayStack = new int[30][]; 68 this.options = options; 69 } 70 71 /** 72 * 73 * INTERNAL USE-ONLY 74 */ 75 // protected void adjustInterfaceModifiers() { 76 // intStack[intPtr - 2] |= AccInterface; 77 // } 78 /* 79 * Will clear the comment stack when looking for a potential JavaDoc which 80 * might contain @deprecated. 81 * 82 * Additionally, before investigating for @deprecated, retrieve the 83 * positions of the JavaDoc comments so as to notify requestor with them. 84 */ 85 // public void checkAnnotation() { 86 // 87 // /* persisting javadoc positions */ 88 // pushOnIntArrayStack(this.getJavaDocPositions()); 89 // boolean deprecated = false; 90 // int lastAnnotationIndex = -1; 91 // int commentPtr = scanner.commentPtr; 92 // 93 // //since jdk1.2 look only in the last java doc comment... 94 // nextComment : for (lastAnnotationIndex = scanner.commentPtr; 95 // lastAnnotationIndex >= 0; lastAnnotationIndex--){ 96 // //look for @deprecated into the first javadoc comment preceeding the 97 // declaration 98 // int commentSourceStart = scanner.commentStarts[lastAnnotationIndex]; 99 // // javadoc only (non javadoc comment have negative end positions.) 100 // if (modifiersSourceStart != -1 && modifiersSourceStart < 101 // commentSourceStart) { 102 // continue nextComment; 103 // } 104 // if (scanner.commentStops[lastAnnotationIndex] < 0) { 105 // continue nextComment; 106 // } 107 // int commentSourceEnd = scanner.commentStops[lastAnnotationIndex] - 1; 108 // //stop is one over 109 // char[] comment = scanner.source; 110 // 111 // deprecated = 112 // checkDeprecation( 113 // commentSourceStart, 114 // commentSourceEnd, 115 // comment); 116 // break nextComment; 117 // } 118 // if (deprecated) { 119 // checkAndSetModifiers(AccDeprecated); 120 // } 121 // // modify the modifier source start to point at the first comment 122 // if (commentPtr >= 0) { 123 // declarationSourceStart = scanner.commentStarts[0]; 124 // } 125 // } 126 /** 127 * 128 * INTERNAL USE-ONLY 129 */ 130 // protected void consumeClassBodyDeclaration() { 131 // // ClassBodyDeclaration ::= Diet Block 132 // //push an Initializer 133 // //optimize the push/pop 134 // 135 // super.consumeClassBodyDeclaration(); 136 // Initializer initializer = (Initializer) astStack[astPtr]; 137 // requestor.acceptInitializer( 138 // initializer.declarationSourceStart, 139 // initializer.declarationSourceEnd, 140 // intArrayStack[intArrayPtr--], 141 // 0, 142 // modifiersSourceStart, 143 // initializer.block.sourceStart, 144 // initializer.block.sourceEnd); 145 // } 146 // /** 147 // * 148 // * INTERNAL USE-ONLY 149 // */ 150 // protected void consumeClassDeclaration() { 151 // super.consumeClassDeclaration(); 152 // // we know that we have a TypeDeclaration on the top of the astStack 153 // if (isLocalDeclaration()) { 154 // // we ignore the local variable declarations 155 // return; 156 // } 157 // requestor.exitClass(endStatementPosition, // '}' is the end of the body 158 // ((TypeDeclaration) astStack[astPtr]).declarationSourceEnd); 159 // } 160 // /** 161 // * 162 // * INTERNAL USE-ONLY 163 // */ 164 // protected void consumeClassHeader() { 165 // //ClassHeader ::= $empty 166 // super.consumeClassHeader(); 167 // if (isLocalDeclaration()) { 168 // // we ignore the local variable declarations 169 // intArrayPtr--; 170 // return; 171 // } 172 // TypeDeclaration typeDecl = (TypeDeclaration) astStack[astPtr]; 173 // TypeReference[] superInterfaces = typeDecl.superInterfaces; 174 // char[][] interfaceNames = null; 175 // int[] interfaceNameStarts = null; 176 // int[] interfaceNameEnds = null; 177 // if (superInterfaces != null) { 178 // int superInterfacesLength = superInterfaces.length; 179 // interfaceNames = new char[superInterfacesLength][]; 180 // interfaceNameStarts = new int[superInterfacesLength]; 181 // interfaceNameEnds = new int[superInterfacesLength]; 182 // for (int i = 0; i < superInterfacesLength; i++) { 183 // TypeReference superInterface = superInterfaces[i]; 184 // interfaceNames[i] = 185 // CharOperation.concatWith(superInterface.getTypeName(), '.'); 186 // interfaceNameStarts[i] = superInterface.sourceStart; 187 // interfaceNameEnds[i] = superInterface.sourceEnd; 188 // } 189 // } 190 // // flush the comments related to the class header 191 // scanner.commentPtr = -1; 192 // TypeReference superclass = typeDecl.superclass; 193 // if (superclass == null) { 194 // requestor.enterClass( 195 // typeDecl.declarationSourceStart, 196 // intArrayStack[intArrayPtr--], 197 // typeDecl.modifiers, 198 // typeDecl.modifiersSourceStart, 199 // typeStartPosition, 200 // typeDecl.name, 201 // typeDecl.sourceStart, 202 // typeDecl.sourceEnd, 203 // null, 204 // -1, 205 // -1, 206 // interfaceNames, 207 // interfaceNameStarts, 208 // interfaceNameEnds, 209 // scanner.currentPosition - 1); 210 // } else { 211 // requestor.enterClass( 212 // typeDecl.declarationSourceStart, 213 // intArrayStack[intArrayPtr--], 214 // typeDecl.modifiers, 215 // typeDecl.modifiersSourceStart, 216 // typeStartPosition, 217 // typeDecl.name, 218 // typeDecl.sourceStart, 219 // typeDecl.sourceEnd, 220 // CharOperation.concatWith(superclass.getTypeName(), '.'), 221 // superclass.sourceStart, 222 // superclass.sourceEnd, 223 // interfaceNames, 224 // interfaceNameStarts, 225 // interfaceNameEnds, 226 // scanner.currentPosition - 1); 227 // 228 // } 229 // } 230 // protected void consumeClassHeaderName() { 231 // // ClassHeaderName ::= Modifiersopt 'class' 'Identifier' 232 // TypeDeclaration typeDecl; 233 // if (nestedMethod[nestedType] == 0) { 234 // if (nestedType != 0) { 235 // typeDecl = new 236 // MemberTypeDeclaration(this.compilationUnit.compilationResult); 237 // } else { 238 // typeDecl = new TypeDeclaration(this.compilationUnit.compilationResult); 239 // } 240 // } else { 241 // // Record that the block has a declaration for local types 242 // typeDecl = new 243 // LocalTypeDeclaration(this.compilationUnit.compilationResult); 244 // markEnclosingMemberWithLocalType(); 245 // blockReal(); 246 // } 247 // 248 // //highlight the name of the type 249 // long pos = identifierPositionStack[identifierPtr]; 250 // typeDecl.sourceEnd = (int) pos; 251 // typeDecl.sourceStart = (int) (pos >>> 32); 252 // typeDecl.name = identifierStack[identifierPtr--]; 253 // identifierLengthPtr--; 254 // 255 // //compute the declaration source too 256 // // 'class' and 'interface' push an int position 257 // typeStartPosition = typeDecl.declarationSourceStart = intStack[intPtr--]; 258 // intPtr--; 259 // int declarationSourceStart = intStack[intPtr--]; 260 // typeDecl.modifiersSourceStart = intStack[intPtr--]; 261 // typeDecl.modifiers = intStack[intPtr--]; 262 // if (typeDecl.declarationSourceStart > declarationSourceStart) { 263 // typeDecl.declarationSourceStart = declarationSourceStart; 264 // } 265 // typeDecl.bodyStart = typeDecl.sourceEnd + 1; 266 // pushOnAstStack(typeDecl); 267 // } 268 // /** 269 // * 270 // * INTERNAL USE-ONLY 271 // */ 272 // protected void consumeCompilationUnit() { 273 // // CompilationUnit ::= EnterCompilationUnit PackageDeclarationopt 274 // ImportDeclarationsopt 275 // requestor.exitCompilationUnit(scanner.source.length - 1); 276 // } 277 /** 278 * 279 * INTERNAL USE-ONLY 280 */ 281 // protected void consumeConstructorDeclaration() { 282 // // ConstructorDeclaration ::= ConstructorHeader ConstructorBody 283 // super.consumeConstructorDeclaration(); 284 // if (isLocalDeclaration()) { 285 // // we ignore the local variable declarations 286 // return; 287 // } 288 // ConstructorDeclaration cd = (ConstructorDeclaration) astStack[astPtr]; 289 // requestor.exitConstructor(endStatementPosition, cd.declarationSourceEnd); 290 // } 291 // /** 292 // * 293 // * INTERNAL USE-ONLY 294 // */ 295 // protected void consumeConstructorHeader() { 296 // // ConstructorHeader ::= ConstructorHeaderName MethodHeaderParameters 297 // MethodHeaderThrowsClauseopt 298 // super.consumeConstructorHeader(); 299 // if (isLocalDeclaration()) { 300 // // we ignore the local variable declarations 301 // intArrayPtr--; 302 // return; 303 // } 304 // ConstructorDeclaration cd = (ConstructorDeclaration) astStack[astPtr]; 305 // Argument[] arguments = cd.arguments; 306 // char[][] argumentTypes = null; 307 // char[][] argumentNames = null; 308 // int[] argumentTypeStarts = null; 309 // int[] argumentTypeEnds = null; 310 // int[] argumentNameStarts = null; 311 // int[] argumentNameEnds = null; 312 // if (arguments != null) { 313 // int argumentLength = arguments.length; 314 // argumentTypes = new char[argumentLength][]; 315 // argumentNames = new char[argumentLength][]; 316 // argumentNameStarts = new int[argumentLength]; 317 // argumentNameEnds = new int[argumentLength]; 318 // argumentTypeStarts = new int[argumentLength]; 319 // argumentTypeEnds = new int[argumentLength]; 320 // for (int i = 0; i < argumentLength; i++) { 321 // Argument argument = arguments[i]; 322 // TypeReference argumentType = argument.type; 323 // argumentTypes[i] = returnTypeName(argumentType); 324 // argumentNames[i] = argument.name; 325 // argumentNameStarts[i] = argument.sourceStart; 326 // argumentNameEnds[i] = argument.sourceEnd; 327 // argumentTypeStarts[i] = argumentType.sourceStart; 328 // argumentTypeEnds[i] = argumentType.sourceEnd; 329 // } 330 // } 331 // TypeReference[] thrownExceptions = cd.thrownExceptions; 332 // char[][] exceptionTypes = null; 333 // int[] exceptionTypeStarts = null; 334 // int[] exceptionTypeEnds = null; 335 // if (thrownExceptions != null) { 336 // int thrownExceptionLength = thrownExceptions.length; 337 // exceptionTypes = new char[thrownExceptionLength][]; 338 // exceptionTypeStarts = new int[thrownExceptionLength]; 339 // exceptionTypeEnds = new int[thrownExceptionLength]; 340 // for (int i = 0; i < thrownExceptionLength; i++) { 341 // TypeReference exception = thrownExceptions[i]; 342 // exceptionTypes[i] = CharOperation.concatWith(exception.getTypeName(), 343 // '.'); 344 // exceptionTypeStarts[i] = exception.sourceStart; 345 // exceptionTypeEnds[i] = exception.sourceEnd; 346 // } 347 // } 348 // requestor 349 // .enterConstructor( 350 // cd.declarationSourceStart, 351 // intArrayStack[intArrayPtr--], 352 // cd.modifiers, 353 // cd.modifiersSourceStart, 354 // cd.selector, 355 // cd.sourceStart, 356 // (int) (selectorSourcePositions & 0xFFFFFFFFL), 357 // // retrieve the source end of the name 358 // argumentTypes, 359 // argumentTypeStarts, 360 // argumentTypeEnds, 361 // argumentNames, 362 // argumentNameStarts, 363 // argumentNameEnds, 364 // rParenPos, 365 // // right parenthesis 366 // exceptionTypes, 367 // exceptionTypeStarts, 368 // exceptionTypeEnds, 369 // scanner.currentPosition - 1); 370 // } 371 // protected void consumeConstructorHeaderName() { 372 // // ConstructorHeaderName ::= Modifiersopt 'Identifier' '(' 373 // ConstructorDeclaration cd = new 374 // ConstructorDeclaration(this.compilationUnit.compilationResult); 375 // 376 // //name -- this is not really revelant but we do ..... 377 // cd.selector = identifierStack[identifierPtr]; 378 // selectorSourcePositions = identifierPositionStack[identifierPtr--]; 379 // identifierLengthPtr--; 380 // 381 // //modifiers 382 // cd.declarationSourceStart = intStack[intPtr--]; 383 // cd.modifiersSourceStart = intStack[intPtr--]; 384 // cd.modifiers = intStack[intPtr--]; 385 // 386 // //highlight starts at the selector starts 387 // cd.sourceStart = (int) (selectorSourcePositions >>> 32); 388 // pushOnAstStack(cd); 389 // 390 // cd.sourceEnd = lParenPos; 391 // cd.bodyStart = lParenPos + 1; 392 // } 393 // protected void consumeDefaultModifiers() { 394 // checkAnnotation(); // might update modifiers with AccDeprecated 395 // pushOnIntStack(modifiers); // modifiers 396 // pushOnIntStack(-1); 397 // pushOnIntStack( 398 // declarationSourceStart >= 0 ? declarationSourceStart : 399 // scanner.startPosition); 400 // resetModifiers(); 401 // } 402 // protected void consumeDiet() { 403 // // Diet ::= $empty 404 // super.consumeDiet(); 405 // /* persisting javadoc positions 406 // * Will be consume in consumeClassBodyDeclaration 407 // */ 408 // pushOnIntArrayStack(this.getJavaDocPositions()); 409 // } 410 // /** 411 // * 412 // * INTERNAL USE-ONLY 413 // */ 414 // protected void consumeEnterCompilationUnit() { 415 // // EnterCompilationUnit ::= $empty 416 // requestor.enterCompilationUnit(); 417 // } 418 // /** 419 // * 420 // * INTERNAL USE-ONLY 421 // */ 422 // protected void consumeEnterVariable() { 423 // // EnterVariable ::= $empty 424 // boolean isLocalDeclaration = isLocalDeclaration(); 425 // if (!isLocalDeclaration && (variablesCounter[nestedType] != 0)) { 426 // requestor.exitField(lastFieldBodyEndPosition, lastFieldEndPosition); 427 // } 428 // char[] name = identifierStack[identifierPtr]; 429 // long namePosition = identifierPositionStack[identifierPtr--]; 430 // int extendedTypeDimension = intStack[intPtr--]; 431 // 432 // AbstractVariableDeclaration declaration; 433 // if (nestedMethod[nestedType] != 0) { 434 // // create the local variable declarations 435 // declaration = 436 // new LocalDeclaration(null, name, (int) (namePosition >>> 32), (int) 437 // namePosition); 438 // } else { 439 // // create the field declaration 440 // declaration = 441 // new FieldDeclaration(null, name, (int) (namePosition >>> 32), (int) 442 // namePosition); 443 // } 444 // identifierLengthPtr--; 445 // TypeReference type; 446 // int variableIndex = variablesCounter[nestedType]; 447 // int typeDim = 0; 448 // if (variableIndex == 0) { 449 // // first variable of the declaration (FieldDeclaration or 450 // LocalDeclaration) 451 // if (nestedMethod[nestedType] != 0) { 452 // // local declaration 453 // declaration.declarationSourceStart = intStack[intPtr--]; 454 // declaration.modifiersSourceStart = intStack[intPtr--]; 455 // declaration.modifiers = intStack[intPtr--]; 456 // type = getTypeReference(typeDim = intStack[intPtr--]); // type dimension 457 // pushOnAstStack(type); 458 // } else { 459 // // field declaration 460 // type = getTypeReference(typeDim = intStack[intPtr--]); // type dimension 461 // pushOnAstStack(type); 462 // declaration.declarationSourceStart = intStack[intPtr--]; 463 // declaration.modifiersSourceStart = intStack[intPtr--]; 464 // declaration.modifiers = intStack[intPtr--]; 465 // } 466 // } else { 467 // type = (TypeReference) astStack[astPtr - variableIndex]; 468 // typeDim = type.dimensions(); 469 // AbstractVariableDeclaration previousVariable = 470 // (AbstractVariableDeclaration) astStack[astPtr]; 471 // declaration.declarationSourceStart = 472 // previousVariable.declarationSourceStart; 473 // declaration.modifiers = previousVariable.modifiers; 474 // declaration.modifiersSourceStart = previousVariable.modifiersSourceStart; 475 // } 476 // 477 // localIntPtr = intPtr; 478 // 479 // if (extendedTypeDimension == 0) { 480 // declaration.type = type; 481 // } else { 482 // int dimension = typeDim + extendedTypeDimension; 483 // //on the identifierLengthStack there is the information about the 484 // type.... 485 // int baseType; 486 // if ((baseType = identifierLengthStack[identifierLengthPtr + 1]) < 0) { 487 // //it was a baseType 488 // declaration.type = TypeReference.baseTypeReference(-baseType, dimension); 489 // declaration.type.sourceStart = type.sourceStart; 490 // declaration.type.sourceEnd = type.sourceEnd; 491 // } else { 492 // declaration.type = this.copyDims(type, dimension); 493 // } 494 // } 495 // variablesCounter[nestedType]++; 496 // nestedMethod[nestedType]++; 497 // pushOnAstStack(declaration); 498 // 499 // int[] javadocPositions = intArrayStack[intArrayPtr]; 500 // if (!isLocalDeclaration) { 501 // requestor 502 // .enterField( 503 // declaration.declarationSourceStart, 504 // javadocPositions, 505 // declaration.modifiers, 506 // declaration.modifiersSourceStart, 507 // returnTypeName(declaration.type), 508 // type.sourceStart, 509 // type.sourceEnd, 510 // typeDims, 511 // name, 512 // (int) (namePosition >>> 32), 513 // (int) namePosition, 514 // extendedTypeDimension, 515 // extendedTypeDimension == 0 ? -1 : endPosition); 516 // } 517 // } 518 // /** 519 // * 520 // * INTERNAL USE-ONLY 521 // */ 522 // protected void consumeExitVariableWithInitialization() { 523 // // ExitVariableWithInitialization ::= $empty 524 // // the scanner is located after the comma or the semi-colon. 525 // // we want to include the comma or the semi-colon 526 // super.consumeExitVariableWithInitialization(); 527 // nestedMethod[nestedType]--; 528 // lastFieldEndPosition = scanner.currentPosition - 1; 529 // lastFieldBodyEndPosition = ((AbstractVariableDeclaration) 530 // astStack[astPtr]).initialization.sourceEnd; 531 // } 532 // protected void consumeExitVariableWithoutInitialization() { 533 // // ExitVariableWithoutInitialization ::= $empty 534 // // do nothing by default 535 // super.consumeExitVariableWithoutInitialization(); 536 // nestedMethod[nestedType]--; 537 // lastFieldEndPosition = scanner.currentPosition - 1; 538 // lastFieldBodyEndPosition = scanner.startPosition - 1; 539 // } 540 // /** 541 // * 542 // * INTERNAL USE-ONLY 543 // */ 544 // protected void consumeFieldDeclaration() { 545 // // See consumeLocalVariableDeclarationDefaultModifier() in case of 546 // change: duplicated code 547 // // FieldDeclaration ::= Modifiersopt Type VariableDeclarators ';' 548 // // the super.consumeFieldDeclaration will reinitialize the 549 // variableCounter[nestedType] 550 // int variableIndex = variablesCounter[nestedType]; 551 // super.consumeFieldDeclaration(); 552 // intArrayPtr--; 553 // if (isLocalDeclaration()) 554 // return; 555 // if (variableIndex != 0) { 556 // requestor.exitField(lastFieldBodyEndPosition, lastFieldEndPosition); 557 // } 558 // } 559 // protected void consumeFormalParameter() { 560 // // FormalParameter ::= Type VariableDeclaratorId ==> false 561 // // FormalParameter ::= Modifiers Type VariableDeclaratorId ==> true 562 // /* 563 // astStack : 564 // identifierStack : type identifier 565 // intStack : dim dim 566 // ==> 567 // astStack : Argument 568 // identifierStack : 569 // intStack : 570 // */ 571 // 572 // identifierLengthPtr--; 573 // char[] name = identifierStack[identifierPtr]; 574 // long namePositions = identifierPositionStack[identifierPtr--]; 575 // TypeReference type = getTypeReference(intStack[intPtr--] + 576 // intStack[intPtr--]); 577 // intPtr -= 3; 578 // Argument arg = 579 // new Argument( 580 // name, 581 // namePositions, 582 // type, 583 // intStack[intPtr + 1]); // modifiers 584 // pushOnAstStack(arg); 585 // intArrayPtr--; 586 // } 587 // /** 588 // * 589 // * INTERNAL USE-ONLY 590 // */ 591 // protected void consumeInterfaceDeclaration() { 592 // super.consumeInterfaceDeclaration(); 593 // // we know that we have a TypeDeclaration on the top of the astStack 594 // if (isLocalDeclaration()) { 595 // // we ignore the local variable declarations 596 // return; 597 // } 598 // requestor.exitInterface(endStatementPosition, // the '}' is the end of 599 // the body 600 // ((TypeDeclaration) astStack[astPtr]).declarationSourceEnd); 601 // } 602 // /** 603 // * 604 // * INTERNAL USE-ONLY 605 // */ 606 // protected void consumeInterfaceHeader() { 607 // //InterfaceHeader ::= $empty 608 // super.consumeInterfaceHeader(); 609 // if (isLocalDeclaration()) { 610 // // we ignore the local variable declarations 611 // intArrayPtr--; 612 // return; 613 // } 614 // TypeDeclaration typeDecl = (TypeDeclaration) astStack[astPtr]; 615 // TypeReference[] superInterfaces = typeDecl.superInterfaces; 616 // char[][] interfaceNames = null; 617 // int[] interfaceNameStarts = null; 618 // int[] interfacenameEnds = null; 619 // int superInterfacesLength = 0; 620 // if (superInterfaces != null) { 621 // superInterfacesLength = superInterfaces.length; 622 // interfaceNames = new char[superInterfacesLength][]; 623 // interfaceNameStarts = new int[superInterfacesLength]; 624 // interfacenameEnds = new int[superInterfacesLength]; 625 // } 626 // if (superInterfaces != null) { 627 // for (int i = 0; i < superInterfacesLength; i++) { 628 // TypeReference superInterface = superInterfaces[i]; 629 // interfaceNames[i] = 630 // CharOperation.concatWith(superInterface.getTypeName(), '.'); 631 // interfaceNameStarts[i] = superInterface.sourceStart; 632 // interfacenameEnds[i] = superInterface.sourceEnd; 633 // } 634 // } 635 // // flush the comments related to the interface header 636 // scanner.commentPtr = -1; 637 // requestor.enterInterface( 638 // typeDecl.declarationSourceStart, 639 // intArrayStack[intArrayPtr--], 640 // typeDecl.modifiers, 641 // typeDecl.modifiersSourceStart, 642 // typeStartPosition, 643 // typeDecl.name, 644 // typeDecl.sourceStart, 645 // typeDecl.sourceEnd, 646 // interfaceNames, 647 // interfaceNameStarts, 648 // interfacenameEnds, 649 // scanner.currentPosition - 1); 650 // } 651 // protected void consumeInterfaceHeaderName() { 652 // // InterfaceHeaderName ::= Modifiersopt 'interface' 'Identifier' 653 // TypeDeclaration typeDecl; 654 // if (nestedMethod[nestedType] == 0) { 655 // if (nestedType != 0) { 656 // typeDecl = new 657 // MemberTypeDeclaration(this.compilationUnit.compilationResult); 658 // } else { 659 // typeDecl = new TypeDeclaration(this.compilationUnit.compilationResult); 660 // } 661 // } else { 662 // // Record that the block has a declaration for local types 663 // typeDecl = new 664 // LocalTypeDeclaration(this.compilationUnit.compilationResult); 665 // markEnclosingMemberWithLocalType(); 666 // blockReal(); 667 // } 668 // 669 // //highlight the name of the type 670 // long pos = identifierPositionStack[identifierPtr]; 671 // typeDecl.sourceEnd = (int) pos; 672 // typeDecl.sourceStart = (int) (pos >>> 32); 673 // typeDecl.name = identifierStack[identifierPtr--]; 674 // identifierLengthPtr--; 675 // 676 // //compute the declaration source too 677 // // 'class' and 'interface' push an int position 678 // typeStartPosition = typeDecl.declarationSourceStart = intStack[intPtr--]; 679 // intPtr--; 680 // int declarationSourceStart = intStack[intPtr--]; 681 // typeDecl.modifiersSourceStart = intStack[intPtr--]; 682 // typeDecl.modifiers = intStack[intPtr--]; 683 // if (typeDecl.declarationSourceStart > declarationSourceStart) { 684 // typeDecl.declarationSourceStart = declarationSourceStart; 685 // } 686 // typeDecl.bodyStart = typeDecl.sourceEnd + 1; 687 // pushOnAstStack(typeDecl); 688 // } 689 // /** 690 // * 691 // * INTERNAL USE-ONLY 692 // */ 693 // protected void consumeLocalVariableDeclaration() { 694 // // See consumeLocalVariableDeclarationDefaultModifier() in case of 695 // change: duplicated code 696 // // FieldDeclaration ::= Modifiersopt Type VariableDeclarators ';' 697 // 698 // super.consumeLocalVariableDeclaration(); 699 // intArrayPtr--; 700 // } 701 // /** 702 // * 703 // * INTERNAL USE-ONLY 704 // */ 705 // protected void consumeMethodDeclaration(boolean isNotAbstract) { 706 // // MethodDeclaration ::= MethodHeader MethodBody 707 // // AbstractMethodDeclaration ::= MethodHeader ';' 708 // super.consumeMethodDeclaration(isNotAbstract); 709 // if (isLocalDeclaration()) { 710 // // we ignore the local variable declarations 711 // return; 712 // } 713 // MethodDeclaration md = (MethodDeclaration) astStack[astPtr]; 714 // requestor.exitMethod(endStatementPosition, md.declarationSourceEnd); 715 // } 716 // /** 717 // * 718 // * INTERNAL USE-ONLY 719 // */ 720 // protected void consumeMethodHeader() { 721 // // MethodHeader ::= MethodHeaderName MethodHeaderParameters 722 // MethodHeaderExtendedDims ThrowsClauseopt 723 // super.consumeMethodHeader(); 724 // if (isLocalDeclaration()) { 725 // // we ignore the local variable declarations 726 // intArrayPtr--; 727 // return; 728 // } 729 // MethodDeclaration md = (MethodDeclaration) astStack[astPtr]; 730 // 731 // TypeReference returnType = md.returnType; 732 // char[] returnTypeName = returnTypeName(returnType); 733 // Argument[] arguments = md.arguments; 734 // char[][] argumentTypes = null; 735 // char[][] argumentNames = null; 736 // int[] argumentTypeStarts = null; 737 // int[] argumentTypeEnds = null; 738 // int[] argumentNameStarts = null; 739 // int[] argumentNameEnds = null; 740 // if (arguments != null) { 741 // int argumentLength = arguments.length; 742 // argumentTypes = new char[argumentLength][]; 743 // argumentNames = new char[argumentLength][]; 744 // argumentNameStarts = new int[argumentLength]; 745 // argumentNameEnds = new int[argumentLength]; 746 // argumentTypeStarts = new int[argumentLength]; 747 // argumentTypeEnds = new int[argumentLength]; 748 // for (int i = 0; i < argumentLength; i++) { 749 // Argument argument = arguments[i]; 750 // TypeReference argumentType = argument.type; 751 // argumentTypes[i] = returnTypeName(argumentType); 752 // argumentNames[i] = argument.name; 753 // argumentNameStarts[i] = argument.sourceStart; 754 // argumentNameEnds[i] = argument.sourceEnd; 755 // argumentTypeStarts[i] = argumentType.sourceStart; 756 // argumentTypeEnds[i] = argumentType.sourceEnd; 757 // } 758 // } 759 // TypeReference[] thrownExceptions = md.thrownExceptions; 760 // char[][] exceptionTypes = null; 761 // int[] exceptionTypeStarts = null; 762 // int[] exceptionTypeEnds = null; 763 // if (thrownExceptions != null) { 764 // int thrownExceptionLength = thrownExceptions.length; 765 // exceptionTypeStarts = new int[thrownExceptionLength]; 766 // exceptionTypeEnds = new int[thrownExceptionLength]; 767 // exceptionTypes = new char[thrownExceptionLength][]; 768 // for (int i = 0; i < thrownExceptionLength; i++) { 769 // TypeReference exception = thrownExceptions[i]; 770 // exceptionTypes[i] = CharOperation.concatWith(exception.getTypeName(), 771 // '.'); 772 // exceptionTypeStarts[i] = exception.sourceStart; 773 // exceptionTypeEnds[i] = exception.sourceEnd; 774 // } 775 // } 776 // requestor 777 // .enterMethod( 778 // md.declarationSourceStart, 779 // intArrayStack[intArrayPtr--], 780 // md.modifiers, 781 // md.modifiersSourceStart, 782 // returnTypeName, 783 // returnType.sourceStart, 784 // returnType.sourceEnd, 785 // typeDims, 786 // md.selector, 787 // md.sourceStart, 788 // (int) (selectorSourcePositions & 0xFFFFFFFFL), 789 // argumentTypes, 790 // argumentTypeStarts, 791 // argumentTypeEnds, 792 // argumentNames, 793 // argumentNameStarts, 794 // argumentNameEnds, 795 // rParenPos, 796 // extendsDim, 797 // extendsDim == 0 ? -1 : endPosition, 798 // exceptionTypes, 799 // exceptionTypeStarts, 800 // exceptionTypeEnds, 801 // scanner.currentPosition - 1); 802 // } 803 // protected void consumeMethodHeaderExtendedDims() { 804 // // MethodHeaderExtendedDims ::= Dimsopt 805 // // now we update the returnType of the method 806 // MethodDeclaration md = (MethodDeclaration) astStack[astPtr]; 807 // int extendedDims = intStack[intPtr--]; 808 // extendsDim = extendedDims; 809 // if (extendedDims != 0) { 810 // TypeReference returnType = md.returnType; 811 // md.sourceEnd = endPosition; 812 // int dims = returnType.dimensions() + extendedDims; 813 // int baseType; 814 // if ((baseType = identifierLengthStack[identifierLengthPtr + 1]) < 0) { 815 // //it was a baseType 816 // int sourceStart = returnType.sourceStart; 817 // int sourceEnd = returnType.sourceEnd; 818 // returnType = TypeReference.baseTypeReference(-baseType, dims); 819 // returnType.sourceStart = sourceStart; 820 // returnType.sourceEnd = sourceEnd; 821 // md.returnType = returnType; 822 // } else { 823 // md.returnType = this.copyDims(md.returnType, dims); 824 // } 825 // if (currentToken == TokenNameLBRACE) { 826 // md.bodyStart = endPosition + 1; 827 // } 828 // } 829 // } 830 // protected void consumeMethodHeaderName() { 831 // // MethodHeaderName ::= Modifiersopt Type 'Identifier' '(' 832 // MethodDeclaration md = new 833 // MethodDeclaration(this.compilationUnit.compilationResult); 834 // 835 // //name 836 // md.selector = identifierStack[identifierPtr]; 837 // selectorSourcePositions = identifierPositionStack[identifierPtr--]; 838 // identifierLengthPtr--; 839 // //type 840 // md.returnType = getTypeReference(typeDims = intStack[intPtr--]); 841 // //modifiers 842 // md.declarationSourceStart = intStack[intPtr--]; 843 // md.modifiersSourceStart = intStack[intPtr--]; 844 // md.modifiers = intStack[intPtr--]; 845 // 846 // //highlight starts at selector start 847 // md.sourceStart = (int) (selectorSourcePositions >>> 32); 848 // pushOnAstStack(md); 849 // md.bodyStart = scanner.currentPosition-1; 850 // } 851 // protected void consumeModifiers() { 852 // checkAnnotation(); // might update modifiers with AccDeprecated 853 // pushOnIntStack(modifiers); // modifiers 854 // pushOnIntStack(modifiersSourceStart); 855 // pushOnIntStack( 856 // declarationSourceStart >= 0 ? declarationSourceStart : 857 // modifiersSourceStart); 858 // resetModifiers(); 859 // } 860 /** 861 * 862 * INTERNAL USE-ONLY 863 */ 864 // protected void consumePackageDeclarationName() { 865 // /* persisting javadoc positions */ 866 // pushOnIntArrayStack(this.getJavaDocPositions()); 867 // 868 // super.consumePackageDeclarationName(); 869 // ImportReference importReference = compilationUnit.currentPackage; 870 // 871 // requestor.acceptPackage( 872 // importReference.declarationSourceStart, 873 // importReference.declarationSourceEnd, 874 // intArrayStack[intArrayPtr--], 875 // CharOperation.concatWith(importReference.getImportName(), '.'), 876 // importReference.sourceStart); 877 // } 878 // protected void consumePushModifiers() { 879 // checkAnnotation(); // might update modifiers with AccDeprecated 880 // pushOnIntStack(modifiers); // modifiers 881 // if (modifiersSourceStart < 0) { 882 // pushOnIntStack(-1); 883 // pushOnIntStack( 884 // declarationSourceStart >= 0 ? declarationSourceStart : 885 // scanner.startPosition); 886 // } else { 887 // pushOnIntStack(modifiersSourceStart); 888 // pushOnIntStack( 889 // declarationSourceStart >= 0 ? declarationSourceStart : 890 // modifiersSourceStart); 891 // } 892 // resetModifiers(); 893 // } 894 // /** 895 // * 896 // * INTERNAL USE-ONLY 897 // */ 898 // protected void consumeSingleTypeImportDeclarationName() { 899 // // SingleTypeImportDeclarationName ::= 'import' Name 900 // 901 // /* persisting javadoc positions */ 902 // pushOnIntArrayStack(this.getJavaDocPositions()); 903 // 904 // super.consumeSingleTypeImportDeclarationName(); 905 // ImportReference importReference = (ImportReference) astStack[astPtr]; 906 // requestor.acceptImport( 907 // importReference.declarationSourceStart, 908 // importReference.declarationSourceEnd, 909 // intArrayStack[intArrayPtr--], 910 // CharOperation.concatWith(importReference.getImportName(), '.'), 911 // importReference.sourceStart, 912 // false); 913 // } 914 // /** 915 // * 916 // * INTERNAL USE-ONLY 917 // */ 918 // protected void consumeStaticInitializer() { 919 // // StaticInitializer ::= StaticOnly Block 920 // //push an Initializer 921 // //optimize the push/pop 922 // super.consumeStaticInitializer(); 923 // Initializer initializer = (Initializer) astStack[astPtr]; 924 // requestor.acceptInitializer( 925 // initializer.declarationSourceStart, 926 // initializer.declarationSourceEnd, 927 // intArrayStack[intArrayPtr--], 928 // AccStatic, 929 // intStack[intPtr--], 930 // initializer.block.sourceStart, 931 // initializer.declarationSourceEnd); 932 // } 933 // protected void consumeStaticOnly() { 934 // // StaticOnly ::= 'static' 935 // checkAnnotation(); // might update declaration source start 936 // pushOnIntStack(modifiersSourceStart); 937 // pushOnIntStack( 938 // declarationSourceStart >= 0 ? declarationSourceStart : 939 // modifiersSourceStart); 940 // jumpOverMethodBody(); 941 // nestedMethod[nestedType]++; 942 // resetModifiers(); 943 // } 944 // /** 945 // * 946 // * INTERNAL USE-ONLY 947 // */ 948 // protected void consumeTypeImportOnDemandDeclarationName() { 949 // // TypeImportOnDemandDeclarationName ::= 'import' Name '.' '*' 950 // 951 // /* persisting javadoc positions */ 952 // pushOnIntArrayStack(this.getJavaDocPositions()); 953 // 954 // super.consumeTypeImportOnDemandDeclarationName(); 955 // ImportReference importReference = (ImportReference) astStack[astPtr]; 956 // requestor.acceptImport( 957 // importReference.declarationSourceStart, 958 // importReference.declarationSourceEnd, 959 // intArrayStack[intArrayPtr--], 960 // CharOperation.concatWith(importReference.getImportName(), '.'), 961 // importReference.sourceStart, 962 // true); 963 // } endParse(int act)964 public CompilationUnitDeclaration endParse(int act) { 965 if (scanner.recordLineSeparator) { 966 requestor.acceptLineSeparatorPositions(scanner.getLineEnds()); 967 } 968 return super.endParse(act); 969 } 970 971 /* 972 * Flush annotations defined prior to a given positions. 973 * 974 * Note: annotations are stacked in syntactical order 975 * 976 * Either answer given <position>, or the end position of a comment line 977 * immediately following the <position> (same line) 978 * 979 * e.g. void foo(){ } // end of method foo 980 */ 981 982 // public int flushAnnotationsDefinedPriorTo(int position) { 983 // 984 // return lastFieldEndPosition = 985 // super.flushAnnotationsDefinedPriorTo(position); 986 // } 987 // protected TypeReference getTypeReference(int dim) { /* build a Reference 988 // on a variable that may be qualified or not 989 // This variable is a type reference and dim will be its dimensions*/ 990 // 991 // int length; 992 // TypeReference ref; 993 // if ((length = identifierLengthStack[identifierLengthPtr--]) == 1) { 994 // // single variable reference 995 // if (dim == 0) { 996 // ref = 997 // new SingleTypeReference( 998 // identifierStack[identifierPtr], 999 // identifierPositionStack[identifierPtr--]); 1000 // } else { 1001 // ref = 1002 // new ArrayTypeReference( 1003 // identifierStack[identifierPtr], 1004 // dim, 1005 // identifierPositionStack[identifierPtr--]); 1006 // ref.sourceEnd = endPosition; 1007 // } 1008 // } else { 1009 // if (length < 0) { //flag for precompiled type reference on base types 1010 // ref = TypeReference.baseTypeReference(-length, dim); 1011 // ref.sourceStart = intStack[intPtr--]; 1012 // if (dim == 0) { 1013 // ref.sourceEnd = intStack[intPtr--]; 1014 // } else { 1015 // intPtr--; 1016 // ref.sourceEnd = endPosition; 1017 // } 1018 // } else { //Qualified variable reference 1019 // char[][] tokens = new char[length][]; 1020 // identifierPtr -= length; 1021 // long[] positions = new long[length]; 1022 // System.arraycopy(identifierStack, identifierPtr + 1, tokens, 0, length); 1023 // System.arraycopy( 1024 // identifierPositionStack, 1025 // identifierPtr + 1, 1026 // positions, 1027 // 0, 1028 // length); 1029 // if (dim == 0) { 1030 // ref = new QualifiedTypeReference(tokens, positions); 1031 // } else { 1032 // ref = new ArrayQualifiedTypeReference(tokens, dim, positions); 1033 // ref.sourceEnd = endPosition; 1034 // } 1035 // } 1036 // }; 1037 // return ref; 1038 // } initialize()1039 public void initialize() { 1040 // positionning the parser for a new compilation unit 1041 // avoiding stack reallocation and all that.... 1042 super.initialize(false); 1043 intArrayPtr = -1; 1044 } 1045 1046 /** 1047 * 1048 * INTERNAL USE-ONLY 1049 */ 1050 // private boolean isLocalDeclaration() { 1051 // int nestedDepth = nestedType; 1052 // while (nestedDepth >= 0) { 1053 // if (nestedMethod[nestedDepth] != 0) { 1054 // return true; 1055 // } 1056 // nestedDepth--; 1057 // } 1058 // return false; 1059 // } 1060 /* 1061 * Investigate one entire unit. 1062 */ parseCompilationUnit(ICompilationUnit unit)1063 public void parseCompilationUnit(ICompilationUnit unit) { 1064 char[] regionSource = unit.getContents(); 1065 try { 1066 initialize(); 1067 goForCompilationUnit(); 1068 referenceContext = compilationUnit = new CompilationUnitDeclaration( 1069 problemReporter(), new CompilationResult(unit, 0, 0, 10), // this.options.maxProblemsPerUnit), 1070 regionSource.length); 1071 scanner.resetTo(0, regionSource.length); 1072 scanner.setSource(regionSource); 1073 parse(); 1074 } catch (AbortCompilation ex) { 1075 } 1076 } 1077 1078 /* 1079 * Investigate one constructor declaration. 1080 */ 1081 // public void parseConstructor(char[] regionSource) { 1082 // try { 1083 // initialize(); 1084 // goForClassBodyDeclarations(); 1085 // referenceContext = 1086 // compilationUnit = 1087 // compilationUnit = 1088 // new CompilationUnitDeclaration( 1089 // problemReporter(), 1090 // new CompilationResult(regionSource, 0, 0, 10), 1091 // //this.options.maxProblemsPerUnit), 1092 // regionSource.length); 1093 // scanner.resetTo(0, regionSource.length); 1094 // scanner.setSource(regionSource); 1095 // parse(); 1096 // } catch (AbortCompilation ex) { 1097 // } 1098 // } 1099 /* 1100 * Investigate one field declaration statement (might have multiple 1101 * declarations in it). 1102 */ 1103 // public void parseField(char[] regionSource) { 1104 // try { 1105 // initialize(); 1106 // goForFieldDeclaration(); 1107 // referenceContext = 1108 // compilationUnit = 1109 // compilationUnit = 1110 // new CompilationUnitDeclaration( 1111 // problemReporter(), 1112 // new CompilationResult(regionSource, 0, 0, 1113 // this.options.maxProblemsPerUnit), 1114 // regionSource.length); 1115 // scanner.resetTo(0, regionSource.length); 1116 // scanner.setSource(regionSource); 1117 // parse(); 1118 // } catch (AbortCompilation ex) { 1119 // } 1120 // 1121 // } 1122 // /* 1123 // * Investigate one import statement declaration. 1124 // */ 1125 // public void parseImport(char[] regionSource) { 1126 // try { 1127 // initialize(); 1128 // goForImportDeclaration(); 1129 // referenceContext = 1130 // compilationUnit = 1131 // compilationUnit = 1132 // new CompilationUnitDeclaration( 1133 // problemReporter(), 1134 // new CompilationResult(regionSource, 0, 0, 1135 // this.options.maxProblemsPerUnit), 1136 // regionSource.length); 1137 // scanner.resetTo(0, regionSource.length); 1138 // scanner.setSource(regionSource); 1139 // parse(); 1140 // } catch (AbortCompilation ex) { 1141 // } 1142 // 1143 // } 1144 // /* 1145 // * Investigate one initializer declaration. 1146 // * regionSource need to content exactly an initializer declaration. 1147 // * e.g: static { i = 4; } 1148 // * { name = "test"; } 1149 // */ 1150 // public void parseInitializer(char[] regionSource) { 1151 // try { 1152 // initialize(); 1153 // goForInitializer(); 1154 // referenceContext = 1155 // compilationUnit = 1156 // compilationUnit = 1157 // new CompilationUnitDeclaration( 1158 // problemReporter(), 1159 // new CompilationResult(regionSource, 0, 0, 1160 // this.options.maxProblemsPerUnit), 1161 // regionSource.length); 1162 // scanner.resetTo(0, regionSource.length); 1163 // scanner.setSource(regionSource); 1164 // parse(); 1165 // } catch (AbortCompilation ex) { 1166 // } 1167 // 1168 // } 1169 // /* 1170 // * Investigate one method declaration. 1171 // */ 1172 // public void parseMethod(char[] regionSource) { 1173 // try { 1174 // initialize(); 1175 // goForGenericMethodDeclaration(); 1176 // referenceContext = 1177 // compilationUnit = 1178 // compilationUnit = 1179 // new CompilationUnitDeclaration( 1180 // problemReporter(), 1181 // new CompilationResult(regionSource, 0, 0, 1182 // this.options.maxProblemsPerUnit), 1183 // regionSource.length); 1184 // scanner.resetTo(0, regionSource.length); 1185 // scanner.setSource(regionSource); 1186 // parse(); 1187 // } catch (AbortCompilation ex) { 1188 // } 1189 // 1190 // } 1191 // /* 1192 // * Investigate one package statement declaration. 1193 // */ 1194 // public void parsePackage(char[] regionSource) { 1195 // try { 1196 // initialize(); 1197 // goForPackageDeclaration(); 1198 // referenceContext = 1199 // compilationUnit = 1200 // compilationUnit = 1201 // new CompilationUnitDeclaration( 1202 // problemReporter(), 1203 // new CompilationResult(regionSource, 0, 0, 1204 // this.options.maxProblemsPerUnit), 1205 // regionSource.length); 1206 // scanner.resetTo(0, regionSource.length); 1207 // scanner.setSource(regionSource); 1208 // parse(); 1209 // } catch (AbortCompilation ex) { 1210 // } 1211 // 1212 // } 1213 // /* 1214 // * Investigate one type declaration, its fields, methods and member types. 1215 // */ 1216 // public void parseType(char[] regionSource) { 1217 // try { 1218 // initialize(); 1219 // goForTypeDeclaration(); 1220 // referenceContext = 1221 // compilationUnit = 1222 // compilationUnit = 1223 // new CompilationUnitDeclaration( 1224 // problemReporter(), 1225 // new CompilationResult(regionSource, 0, 0, 1226 // this.options.maxProblemsPerUnit), 1227 // regionSource.length); 1228 // scanner.resetTo(0, regionSource.length); 1229 // scanner.setSource(regionSource); 1230 // parse(); 1231 // } catch (AbortCompilation ex) { 1232 // } 1233 // 1234 // } 1235 /** 1236 * Returns this parser's problem reporter initialized with its reference 1237 * context. Also it is assumed that a problem is going to be reported, so 1238 * initializes the compilation result's line positions. 1239 */ problemReporter()1240 public ProblemReporter problemReporter() { 1241 problemReporter.referenceContext = referenceContext; 1242 return problemReporter; 1243 } 1244 pushOnIntArrayStack(int[] positions)1245 protected void pushOnIntArrayStack(int[] positions) { 1246 1247 try { 1248 intArrayStack[++intArrayPtr] = positions; 1249 } catch (IndexOutOfBoundsException e) { 1250 // intPtr is correct 1251 int oldStackLength = intArrayStack.length; 1252 int oldStack[][] = intArrayStack; 1253 intArrayStack = new int[oldStackLength + StackIncrement][]; 1254 System.arraycopy(oldStack, 0, intArrayStack, 0, oldStackLength); 1255 intArrayStack[intArrayPtr] = positions; 1256 } 1257 } 1258 1259 // protected void resetModifiers() { 1260 // super.resetModifiers(); 1261 // declarationSourceStart = -1; 1262 // } 1263 /* 1264 * Syntax error was detected. Will attempt to perform some recovery action 1265 * in order to resume to the regular parse loop. 1266 */ resumeOnSyntaxError()1267 protected boolean resumeOnSyntaxError() { 1268 return false; 1269 } 1270 /* 1271 * Answer a char array representation of the type name formatted like: - 1272 * type name + dimensions Example: "A[][]".toCharArray() 1273 * "java.lang.String".toCharArray() 1274 */ 1275 // private char[] returnTypeName(TypeReference type) { 1276 // int dimension = type.dimensions(); 1277 // if (dimension != 0) { 1278 // char[] dimensionsArray = new char[dimension * 2]; 1279 // for (int i = 0; i < dimension; i++) { 1280 // dimensionsArray[i*2] = '['; 1281 // dimensionsArray[(i*2) + 1] = ']'; 1282 // } 1283 // return CharOperation.concat( 1284 // CharOperation.concatWith(type.getTypeName(), '.'), 1285 // dimensionsArray); 1286 // } 1287 // return CharOperation.concatWith(type.getTypeName(), '.'); 1288 // } 1289 // public String toString() { 1290 // StringBuffer buffer = new StringBuffer(); 1291 // buffer.append("intArrayPtr = " + intArrayPtr + "\n"); //$NON-NLS-1$ 1292 // //$NON-NLS-2$ 1293 // buffer.append(super.toString()); 1294 // return buffer.toString(); 1295 // } 1296 // /** 1297 // * INTERNAL USE ONLY 1298 // */ 1299 // protected TypeReference typeReference( 1300 // int dim, 1301 // int localIdentifierPtr, 1302 // int localIdentifierLengthPtr) { 1303 // /* build a Reference on a variable that may be qualified or not 1304 // * This variable is a type reference and dim will be its dimensions. 1305 // * We don't have any side effect on the stacks' pointers. 1306 // */ 1307 // 1308 // int length; 1309 // TypeReference ref; 1310 // if ((length = identifierLengthStack[localIdentifierLengthPtr]) == 1) { 1311 // // single variable reference 1312 // if (dim == 0) { 1313 // ref = 1314 // new SingleTypeReference( 1315 // identifierStack[localIdentifierPtr], 1316 // identifierPositionStack[localIdentifierPtr--]); 1317 // } else { 1318 // ref = 1319 // new ArrayTypeReference( 1320 // identifierStack[localIdentifierPtr], 1321 // dim, 1322 // identifierPositionStack[localIdentifierPtr--]); 1323 // ref.sourceEnd = endPosition; 1324 // } 1325 // } else { 1326 // if (length < 0) { //flag for precompiled type reference on base types 1327 // ref = TypeReference.baseTypeReference(-length, dim); 1328 // ref.sourceStart = intStack[localIntPtr--]; 1329 // if (dim == 0) { 1330 // ref.sourceEnd = intStack[localIntPtr--]; 1331 // } else { 1332 // localIntPtr--; 1333 // ref.sourceEnd = endPosition; 1334 // } 1335 // } else { //Qualified variable reference 1336 // char[][] tokens = new char[length][]; 1337 // localIdentifierPtr -= length; 1338 // long[] positions = new long[length]; 1339 // System.arraycopy(identifierStack, localIdentifierPtr + 1, tokens, 0, 1340 // length); 1341 // System.arraycopy( 1342 // identifierPositionStack, 1343 // localIdentifierPtr + 1, 1344 // positions, 1345 // 0, 1346 // length); 1347 // if (dim == 0) 1348 // ref = new QualifiedTypeReference(tokens, positions); 1349 // else 1350 // ref = new ArrayQualifiedTypeReference(tokens, dim, positions); 1351 // } 1352 // }; 1353 // return ref; 1354 // } 1355 }