|
41 | 41 |
|
42 | 42 | import javax.swing.*;
|
43 | 43 | import java.util.ArrayList;
|
| 44 | +import java.util.HashSet; |
44 | 45 | import java.util.List;
|
45 | 46 |
|
46 | 47 | /**
|
@@ -460,11 +461,56 @@ static String getParamSignature(LuaFuncBodyOwner funcBodyOwner) {
|
460 | 461 | LuaParamInfo[] params = funcBodyOwner.getParams();
|
461 | 462 | String[] list = new String[params.length];
|
462 | 463 | 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; |
464 | 469 | }
|
465 | 470 | return "(" + String.join(", ", list) + ")";
|
466 | 471 | }
|
467 | 472 |
|
| 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 | + |
468 | 514 | public static PsiElement getNameIdentifier(LuaLocalFuncDef localFuncDef) {
|
469 | 515 | return localFuncDef.getId();
|
470 | 516 | }
|
|
0 commit comments