Skip to content

Commit 2141a01

Browse files
committed
processOptionalFunc
1 parent 405b858 commit 2141a01

File tree

1 file changed

+47
-1
lines changed

1 file changed

+47
-1
lines changed

src/main/java/com/tang/intellij/lua/psi/LuaPsiImplUtil.java

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141

4242
import javax.swing.*;
4343
import java.util.ArrayList;
44+
import java.util.HashSet;
4445
import java.util.List;
4546

4647
/**
@@ -460,11 +461,56 @@ static String getParamSignature(LuaFuncBodyOwner funcBodyOwner) {
460461
LuaParamInfo[] params = funcBodyOwner.getParams();
461462
String[] list = new String[params.length];
462463
for (int i = 0; i < params.length; i++) {
463-
list[i] = params[i].getName();
464+
LuaParamInfo lpi = params[i];
465+
String s = lpi.getName();
466+
if (lpi.isOptional())
467+
s = "[" + s + "]";
468+
list[i] = s;
464469
}
465470
return "(" + String.join(", ", list) + ")";
466471
}
467472

473+
public interface OptionalFuncProcessor {
474+
void accept(String signature, int mask);
475+
}
476+
477+
private static HashSet<Integer> sets = new HashSet<>();
478+
public static void processOptional(LuaParamInfo[] params, OptionalFuncProcessor processor) {
479+
sets.clear();
480+
processOptionalFunc(params, processor);
481+
}
482+
private static void processOptionalFunc(LuaParamInfo[] params, OptionalFuncProcessor processor) {
483+
int mask = 0;
484+
String signature = "(";
485+
486+
for (int i = 0; i < params.length; i++) {
487+
LuaParamInfo info = params[i];
488+
if (info != null) {
489+
if (mask > 0) {
490+
signature += ", " + info.getName();
491+
} else {
492+
signature += info.getName();
493+
}
494+
mask = mask | (1 << i);
495+
}
496+
}
497+
498+
signature += ")";
499+
processor.accept(signature, mask);
500+
sets.add(mask);
501+
for (int i = 0; i < params.length; i++) {
502+
LuaParamInfo info = params[i];
503+
if (info != null && info.isOptional()) {
504+
int s = mask ^ (1 << i);
505+
if (!sets.contains(s)) {
506+
params[i] = null;
507+
processOptionalFunc(params, processor);
508+
params[i] = info;
509+
}
510+
}
511+
}
512+
}
513+
468514
public static PsiElement getNameIdentifier(LuaLocalFuncDef localFuncDef) {
469515
return localFuncDef.getId();
470516
}

0 commit comments

Comments
 (0)