static L tok_typesOfParams(L tok) { try { new L types; for (int i = 1; i < l(tok); ) { S t = tok.get(i); if (eqOneOf(t, "final")) t = get(tok, i += 2); assertTrue(isIdentifier(t)); i += 2; S type = t; if (eq(t, "virtual")) { type += " " + tok.get(i); i += 2; } while (eq(get(tok, i), ".") && isIdentifier(get(tok, i+2))) { type += "." + get(tok, i+2); i += 4; } // ... if (eqGet(tok, i, ".") && eqGet(tok, i+2, ".") && eqGet(tok, i+2, ".")) { type += "[]"; i += 6; } // just a parameter name, no type if (eqOneOf(get(tok, i), null, ",")) t = null; else { if (eq(tok.get(i), "<")) { int j = findEndOfTypeArgs(tok, i)-1; while (eq(get(tok, j), "[") && eq(get(tok, j+2), "]")) j += 4; type += trimJoinSubList(tok, i, j+1); S id = assertIdentifier(tok.get(j+2)); i = j+2; } while (eq(get(tok, i), "[") && eq(get(tok, i+2), "]")) { i += 4; type += "[]"; } S id = assertIdentifier(tok.get(i)); i += 2; while (eq(get(tok, i), "[") && eq(get(tok, i+2), "]")) { i += 4; type += "[]"; } if (i < l(tok)) { assertEquals(get(tok, i), ","); i += 2; } } types.add(type); } ret types; } catch e { print("Bad parameter declaration: " + join(tok)); throw rethrow(e); } } static L tok_typesOfParams(S s) { ret tok_typesOfParams(javaTok(s)); }