{"record":{"id":"caa7ea6fdcdb5e4d","repo":"oracle/graal","slug":"directed-inlining-rule-componentname-filter-must","errorCode":null,"errorMessage":"Directed inlining rule {componentName} filter must be a single positive MethodFilter pattern; use ',' to separate rules: {ruleSpec}","messagePattern":"Directed inlining rule (.+?) filter must be a single positive MethodFilter pattern; use ',' to separate rules: (.+?)","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/phases/common/inlining/DirectedInliningRules.java","lineNumber":391,"sourceCode":"\n    private static ReceiverTypeFilter parseReceiverTypeFilter(String typeSpec, String ruleSpec) {\n        if (typeSpec.indexOf('*') >= 0 || typeSpec.indexOf('?') >= 0 ||\n                        typeSpec.indexOf('|') >= 0 || typeSpec.indexOf('@') >= 0 ||\n                        typeSpec.indexOf('(') >= 0 || typeSpec.indexOf(')') >= 0 ||\n                        typeSpec.indexOf('{') >= 0 || typeSpec.indexOf('}') >= 0 ||\n                        typeSpec.startsWith(\"~\")) {\n            throw new IllegalArgumentException(\"Directed inlining rule receiver type filter must contain simple or qualified positive type names: \" +\n                            ruleSpec);\n        }\n        return new ReceiverTypeFilter(typeSpec);\n    }\n\n    private static MethodFilter parseSinglePositiveMethodFilter(String filterSpec, String componentName, String ruleSpec) {\n        if (filterSpec.indexOf('*') >= 0 || filterSpec.indexOf('?') >= 0 ||\n                        findLastTopLevel(filterSpec, ',') >= 0 || filterSpec.indexOf('|') >= 0 ||\n                        filterSpec.indexOf('@') >= 0 || filterSpec.indexOf('{') >= 0 || filterSpec.indexOf('}') >= 0 ||\n                        filterSpec.startsWith(\"~\")) {\n            throw new IllegalArgumentException(\"Directed inlining rule \" + componentName +\n                            \" filter must be a single positive MethodFilter pattern; use ',' to separate rules: \" + ruleSpec);\n        }\n        return MethodFilter.parse(filterSpec);\n    }\n\n    private static IllegalArgumentException invalidRule(String ruleSpec) {\n        return new IllegalArgumentException(\"Directed inlining rule must have the form \" + EXPECTED_RULE_FORMAT + \": \" + ruleSpec);\n    }\n\n    private String findRule(Callsite[] callsites, ResolvedJavaMethod declaredCalleeMethod, ResolvedJavaMethod concreteCalleeMethod, ResolvedJavaType receiverType, boolean includePrefixes) {\n        for (Rule rule : rules) {\n            if (rule.matchesDirectedInvoke(callsites, declaredCalleeMethod, receiverType) ||\n                            (includePrefixes && rule.matchesDirectedPrefix(callsites, declaredCalleeMethod, concreteCalleeMethod, receiverType))) {\n                return rule.ruleSpec();\n            }\n        }\n        return null;\n    }","sourceCodeStart":373,"sourceCodeEnd":409,"githubUrl":"https://github.com/oracle/graal/blob/a66e9ccd1d7bf2552883939aa0788dfd0e294aab/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/phases/common/inlining/DirectedInliningRules.java#L373-L409","documentation":"parseSinglePositiveMethodFilter (DirectedInliningRules.java:391) validates the caller/callee method filter of each directed-inlining rule. It must be a single positive MethodFilter pattern: no wildcards ('*', '?'), no comma-separated alternatives, no '|' alternation, no '@', no braces, and no leading '~' negation. The restriction exists because a directed rule must identify exactly one callsite path.","triggerScenarios":"A rule like 'inline : com.foo.* -> com.bar.B.g()' (wildcard), 'A.f,B.h -> C.g()' (comma list), or '~A.f -> B.g()' (negation).","commonSituations":"Copying glob-style patterns from -Dgraal.MethodFilter-style options into directed rules; trying to compress many rules into one line.","solutions":["Write one exact method or exact-class pattern per rule (e.g., 'com.foo.A.f' or 'com.foo.A::*')","Emit multiple rules instead of comma-separated alternatives","Re-read the error text: it explicitly says to use ',' to separate rules"],"exampleFix":"# before\ninline : com.foo.*,com.bar.* -> com.baz.C.g()\n\n# after\ninline : com.foo.* -> com.baz.C.g()\ninline : com.bar.* -> com.baz.C.g()","handlingStrategy":"validation","validationCode":"static boolean isSinglePositiveFilter(String f) {\n    return !f.contains(\"*\") && !f.contains(\"?\") && !f.contains(\",\") && !f.contains(\"|\") && !f.contains(\"@\") && !f.contains(\"{\") && !f.contains(\"}\") && !f.startsWith(\"~\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["One exact method pattern per rule; emit multiple rules for alternatives","Do not copy glob-style -Dgraal.MethodFilter values into directed-inlining rules"],"tags":["graal","inlining","parsing","method-filter","rules"],"backgroundTag":null,"analyzedSha":"a66e9ccd1d7bf2552883939aa0788dfd0e294aab","analyzedAt":"2026-08-14T13:58:47.161Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}