sclass Tok_MethodDecl { LS tok; int iStart, iModifiers, iJavaXMod, iTypeArgs, iType, iEndOfType, iJavaXMod; int iName, iOpening; S name; LS allNames; int iBody, iEndOfBody; bool parsed; *(LS tok, int *iStart) { iOpening = indexOf(tok, iStart, "("); if (iOpening < 0) ret; iName = iOpening-2; name = get(tok, iName); allNames.add(name); if (!isIdentifier(name)) ret; while (eqGet(tok, iName-2, "aka") && isIdentifier(get(tok, iName-2))) { iName -= 4; name = get(tok, iName); allNames.add(name); } // find end of arguments int iClosing = findEndOfBracketPart2(tok, iOpening)-1; // find javax modifiers, return type & modifiers iJavaXMod = tok_leftScanJavaxModifiers(tok, iName); iEndOfType = iJavaXMod; iType = tok_leftScanType(tok, iJavaXMod); iTypeArgs = tok_leftScanTypeArgsOpt(tok, iType); iModifiers = leftScanModifiers(tok, iTypeArgs); iStart = iModifiers; } simplyCached LS args_unparsed() { ret tok_parseArgsDeclList2(subList(tok, iOpening+1, iClosing)); } // return type simplyCached LS tokType() ret subList(tok, iType-1, iName1); } S type() { ret join(tokType()); } simplyCached bool isVoid() { ret containsOneOf(codeTokens(tokType()), javaxVoidAliases()); } // drop all but first name clearTokens(tok, iName1+1, iLastName+1); // modifiers include return type actually LS tokModifiers = cloneSubList(tok, iStart, iName1-1); tokModifiers.remove("abstract"); S modifiers = join(tokModifiers); if (!containsOneOf(tokModifiers, "final", "default")) modifiers = "final " + modifiers; S _modifiers = modifiers; int iBodyOpen = indexOfAny(tok, iClosing, "{", ";"); reverseInPlace(allNames); set parsed; } }