Libraryless. Click here for Pure Java version (6104L/35K).
static boolean findFunctionInvocations_debug;
// these prefix tokens mark a non-invocation (TODO: expand)
static Set<S> findFunctionInvocations_pre = new HashSet(litlist(".", "void", "S", "String", "int", "bool", "boolean", "A", "Object", "O", "]", "double", "float", "short", "char", "long"));
static Set<String> findFunctionInvocations(S src, SS sf) {
ret findFunctionInvocations(javaTok(src), sf);
}
static Set<String> findFunctionInvocations(L<S> tok, SS sf) {
ret findFunctionInvocations(tok, sf, null);
}
// sf = set of functions to search for or null for any function
static Set<String> findFunctionInvocations(L<S> tok, SS sf, Collection<S> hardReferences) {
ret findFunctionInvocations(tok, sf, hardReferences, null);
}
static Set<String> findFunctionInvocations(L<S> tok, SS sf, Collection<S> hardReferences, Set<S> haveFunctions) {
ret findFunctionInvocations(tok, sf, hardReferences, haveFunctions, false);
}
// tok: the code
// sf: map of functions (keys) to look for - null to record every function call
// hardReferences (out parameter): records every "please include" statement if not null
// haveFunctions: functions to skip (or null)
// includePossiblyMapLikes: include calls with pre-brackets argument (e.g. map l(...))
// mainClassName: name of program's main class (calls to this class will be skipped)
static Set<S> findFunctionInvocations(LS tok, SS sf, Cl<S> hardReferences, Set<S> haveFunctions, bool includePossiblyMapLikes, S mainClassName default "main") {
new LinkedHashSet<S> l;
for (int i : jfindAll(tok, "please include functions")) {
int j = i + 6;
while licensed {
String fname = tok.get(j);
assertIdentifier("in please include functions section", get(tok, j));
l.add(fname);
add(hardReferences, fname);
j += 2;
if (eqGet(tok, j, ".")) break;
while (eqGetOneOf(tok, j, ",", "and")) j += 2;
}
clearAllTokens(tok.subList(i, j+2));
}
for (int i : jfindAll(tok, "please include function *.")) {
String fname = tok.get(i+6);
l.add(fname);
add(hardReferences, fname);
clearAllTokens(tok.subList(i, i+10));
}
int i, n = tok.size();
boolean result = false;
for (i = 1; i+2 < n; i += 2) {
S f = tok.get(i);
if (!isIdentifier_quick(f)) continue;
// main.<A>bla()
if (eq(mainClassName, f) && eq(tok.get(i+2), ".") && eqGet(tok, i+4, "<")) {
i = findEndOfTypeArgs(tok, i+4)+1;
f = tok.get(i);
if (!isIdentifier(f)) continue;
}
if (findFunctionInvocations_debug)
print("Testing identifier " + f);
// e.g. ... html_findLIs(LS [auto htmlTok] tok) { ... }
if (eqGet(tok, i-4, "[") && eqGet(tok, i-2, "auto")) {
// ok
} else if (eqGet(tok, i-2, ":") && eqGet(tok, i-4, ":") && eqGet(tok, i-6, mainClassName)) {
// ok, function reference (main::bla)
} else if (eqGet(tok, i+2, "(")) {
// ok, normal function invocation
} else if (includePossiblyMapLikes && eqGet(tok, i+4, "(") && isIdentifier(get(tok, i+2))) {
// ok, mapLike invocation (bla blubb(...))
} else
// not an invocation
continue;
if (i == 1
|| !findFunctionInvocations_pre.contains(tok.get(i-2))
|| eqGet(tok, i-2, ".") && eqGet(tok, i-4, mainClassName)) {
boolean inSF = sf == null || sf.containsKey(f);
if (findFunctionInvocations_debug)
print("Possible invocation: " + f + ", inSF: " + inSF);
if (inSF && !contains(haveFunctions, f) && l.add(f))
if (findFunctionInvocations_debug)
print("Found reference to standard function " + f + ": " + lineAroundToken(tok, i));
}
}
return l;
}download show line numbers debug dex old transpilations
Travelled to 15 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, irmadwmeruwu, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt, xrpafgyirdlv
No comments. add comment
| Snippet ID: | #1003268 |
| Snippet name: | findFunctionInvocations - parse Java source for function invocations - removes "please include function" lines - TODO: type arguments |
| Eternal ID of this version: | #1003268/35 |
| Text MD5: | c1de64f1e33e7bc36449a4e35450cbd3 |
| Transpilation MD5: | 287b73eb4c032dd13f4ae997c5509308 |
| Author: | stefan |
| Category: | javax / html |
| Type: | JavaX fragment (include) |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2022-01-28 21:12:46 |
| Source code size: | 3766 bytes / 94 lines |
| Pitched / IR pitched: | No / No |
| Views / Downloads: | 1306 / 2015 |
| Version history: | 34 change(s) |
| Referenced in: | #1006654 - Standard functions list 2 (LIVE, continuation of #761) #1034872 - findFunctionInvocations backup #1034873 - findFunctionInvocations_v2 - parse Java source for function invocations - removes "please include function" lines - TODO: type arguments |