@adhisang/minecraft-modding-mcp 4.0.0 → 4.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +61 -0
- package/README.md +40 -23
- package/dist/build-suggested-call.d.ts +29 -0
- package/dist/build-suggested-call.js +58 -0
- package/dist/cache-registry.d.ts +3 -1
- package/dist/cache-registry.js +50 -6
- package/dist/entry-tools/analyze-symbol-service.d.ts +16 -16
- package/dist/entry-tools/batch-class-members-service.d.ts +34 -0
- package/dist/entry-tools/batch-class-members-service.js +97 -0
- package/dist/entry-tools/batch-class-source-service.d.ts +37 -0
- package/dist/entry-tools/batch-class-source-service.js +100 -0
- package/dist/entry-tools/batch-mappings-service.d.ts +36 -0
- package/dist/entry-tools/batch-mappings-service.js +66 -0
- package/dist/entry-tools/batch-runner.d.ts +72 -0
- package/dist/entry-tools/batch-runner.js +90 -0
- package/dist/entry-tools/batch-symbol-exists-service.d.ts +46 -0
- package/dist/entry-tools/batch-symbol-exists-service.js +113 -0
- package/dist/entry-tools/compare-minecraft-service.d.ts +6 -6
- package/dist/entry-tools/inspect-minecraft/handlers/artifact.d.ts +5 -0
- package/dist/entry-tools/inspect-minecraft/handlers/artifact.js +83 -0
- package/dist/entry-tools/inspect-minecraft/handlers/class-members.d.ts +6 -0
- package/dist/entry-tools/inspect-minecraft/handlers/class-members.js +80 -0
- package/dist/entry-tools/inspect-minecraft/handlers/class-overview.d.ts +5 -0
- package/dist/entry-tools/inspect-minecraft/handlers/class-overview.js +248 -0
- package/dist/entry-tools/inspect-minecraft/handlers/class-source.d.ts +5 -0
- package/dist/entry-tools/inspect-minecraft/handlers/class-source.js +60 -0
- package/dist/entry-tools/inspect-minecraft/handlers/file.d.ts +5 -0
- package/dist/entry-tools/inspect-minecraft/handlers/file.js +54 -0
- package/dist/entry-tools/inspect-minecraft/handlers/list-files.d.ts +5 -0
- package/dist/entry-tools/inspect-minecraft/handlers/list-files.js +100 -0
- package/dist/entry-tools/inspect-minecraft/handlers/search.d.ts +5 -0
- package/dist/entry-tools/inspect-minecraft/handlers/search.js +155 -0
- package/dist/entry-tools/inspect-minecraft/handlers/versions.d.ts +6 -0
- package/dist/entry-tools/inspect-minecraft/handlers/versions.js +49 -0
- package/dist/entry-tools/inspect-minecraft/internal.d.ts +1042 -0
- package/dist/entry-tools/inspect-minecraft/internal.js +448 -0
- package/dist/entry-tools/inspect-minecraft-service.d.ts +193 -308
- package/dist/entry-tools/inspect-minecraft-service.js +20 -1244
- package/dist/entry-tools/manage-cache-service.d.ts +16 -16
- package/dist/entry-tools/validate-project/cases/access-transformer.d.ts +6 -0
- package/dist/entry-tools/validate-project/cases/access-transformer.js +106 -0
- package/dist/entry-tools/validate-project/cases/access-widener.d.ts +6 -0
- package/dist/entry-tools/validate-project/cases/access-widener.js +86 -0
- package/dist/entry-tools/validate-project/cases/mixin.d.ts +6 -0
- package/dist/entry-tools/validate-project/cases/mixin.js +90 -0
- package/dist/entry-tools/validate-project/cases/project-summary.d.ts +102 -0
- package/dist/entry-tools/validate-project/cases/project-summary.js +415 -0
- package/dist/entry-tools/validate-project/internal.d.ts +142 -0
- package/dist/entry-tools/validate-project/internal.js +303 -0
- package/dist/entry-tools/validate-project-service.d.ts +67 -47
- package/dist/entry-tools/validate-project-service.js +13 -563
- package/dist/entry-tools/verify-mixin-target-service.d.ts +133 -0
- package/dist/entry-tools/verify-mixin-target-service.js +323 -0
- package/dist/error-mapping.d.ts +40 -0
- package/dist/error-mapping.js +139 -0
- package/dist/errors.d.ts +6 -0
- package/dist/errors.js +6 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +147 -1354
- package/dist/mapping/internal-types.d.ts +54 -0
- package/dist/mapping/internal-types.js +14 -0
- package/dist/mapping/loaders/mojang.d.ts +2 -0
- package/dist/mapping/loaders/mojang.js +64 -0
- package/dist/mapping/loaders/tiny-loom.d.ts +2 -0
- package/dist/mapping/loaders/tiny-loom.js +73 -0
- package/dist/mapping/loaders/tiny-maven.d.ts +2 -0
- package/dist/mapping/loaders/tiny-maven.js +104 -0
- package/dist/mapping/loaders/types.d.ts +14 -0
- package/dist/mapping/loaders/types.js +2 -0
- package/dist/mapping/lookup.d.ts +52 -0
- package/dist/mapping/lookup.js +496 -0
- package/dist/mapping/parsers/normalize.d.ts +10 -0
- package/dist/mapping/parsers/normalize.js +52 -0
- package/dist/mapping/parsers/proguard.d.ts +20 -0
- package/dist/mapping/parsers/proguard.js +138 -0
- package/dist/mapping/parsers/symbol-records.d.ts +27 -0
- package/dist/mapping/parsers/symbol-records.js +216 -0
- package/dist/mapping/parsers/tiny.d.ts +9 -0
- package/dist/mapping/parsers/tiny.js +96 -0
- package/dist/mapping/types.d.ts +147 -0
- package/dist/mapping/types.js +2 -0
- package/dist/mapping-pipeline-service.js +3 -2
- package/dist/mapping-service.d.ts +8 -145
- package/dist/mapping-service.js +30 -1207
- package/dist/mixin/access-validators.d.ts +9 -0
- package/dist/mixin/access-validators.js +257 -0
- package/dist/mixin/annotation-validators.d.ts +5 -0
- package/dist/mixin/annotation-validators.js +162 -0
- package/dist/mixin/helpers.d.ts +28 -0
- package/dist/mixin/helpers.js +315 -0
- package/dist/mixin/parsed-validator.d.ts +8 -0
- package/dist/mixin/parsed-validator.js +337 -0
- package/dist/mixin/types.d.ts +208 -0
- package/dist/mixin/types.js +28 -0
- package/dist/mixin-validator.d.ts +9 -201
- package/dist/mixin-validator.js +8 -1020
- package/dist/source/access-validate.d.ts +4 -0
- package/dist/source/access-validate.js +254 -0
- package/dist/source/artifact-resolver.d.ts +111 -0
- package/dist/source/artifact-resolver.js +1271 -0
- package/dist/source/cache-metrics.d.ts +26 -0
- package/dist/source/cache-metrics.js +172 -0
- package/dist/source/class-source/members-builder.d.ts +34 -0
- package/dist/source/class-source/members-builder.js +46 -0
- package/dist/source/class-source/snippet-builder.d.ts +19 -0
- package/dist/source/class-source/snippet-builder.js +46 -0
- package/dist/source/class-source-helpers.d.ts +34 -0
- package/dist/source/class-source-helpers.js +140 -0
- package/dist/source/class-source.d.ts +42 -0
- package/dist/source/class-source.js +883 -0
- package/dist/source/descriptor-utils.d.ts +6 -0
- package/dist/source/descriptor-utils.js +37 -0
- package/dist/source/file-access.d.ts +4 -0
- package/dist/source/file-access.js +102 -0
- package/dist/source/indexer.d.ts +82 -0
- package/dist/source/indexer.js +522 -0
- package/dist/source/lifecycle/diff-utils.d.ts +9 -0
- package/dist/source/lifecycle/diff-utils.js +107 -0
- package/dist/source/lifecycle/diff.d.ts +2 -0
- package/dist/source/lifecycle/diff.js +265 -0
- package/dist/source/lifecycle/mapping-helpers.d.ts +22 -0
- package/dist/source/lifecycle/mapping-helpers.js +327 -0
- package/dist/source/lifecycle/runtime-check.d.ts +2 -0
- package/dist/source/lifecycle/runtime-check.js +142 -0
- package/dist/source/lifecycle/trace.d.ts +2 -0
- package/dist/source/lifecycle/trace.js +231 -0
- package/dist/source/lifecycle.d.ts +4 -0
- package/dist/source/lifecycle.js +5 -0
- package/dist/source/search.d.ts +51 -0
- package/dist/source/search.js +676 -0
- package/dist/source/shared-utils.d.ts +6 -0
- package/dist/source/shared-utils.js +55 -0
- package/dist/source/state.d.ts +26 -0
- package/dist/source/state.js +24 -0
- package/dist/source/symbol-resolver.d.ts +3 -0
- package/dist/source/symbol-resolver.js +212 -0
- package/dist/source/validate-mixin/pipeline/mapping-health.d.ts +3 -0
- package/dist/source/validate-mixin/pipeline/mapping-health.js +41 -0
- package/dist/source/validate-mixin/pipeline/parse.d.ts +2 -0
- package/dist/source/validate-mixin/pipeline/parse.js +10 -0
- package/dist/source/validate-mixin/pipeline/resolve.d.ts +3 -0
- package/dist/source/validate-mixin/pipeline/resolve.js +78 -0
- package/dist/source/validate-mixin/pipeline/target-lookup.d.ts +6 -0
- package/dist/source/validate-mixin/pipeline/target-lookup.js +260 -0
- package/dist/source/validate-mixin/pipeline-context.d.ts +72 -0
- package/dist/source/validate-mixin/pipeline-context.js +93 -0
- package/dist/source/validate-mixin.d.ts +22 -0
- package/dist/source/validate-mixin.js +799 -0
- package/dist/source/workspace-target.d.ts +18 -0
- package/dist/source/workspace-target.js +305 -0
- package/dist/source-resolver.d.ts +1 -0
- package/dist/source-resolver.js +1 -1
- package/dist/source-service.d.ts +164 -170
- package/dist/source-service.js +70 -6116
- package/dist/stage-emitter.d.ts +13 -0
- package/dist/stage-emitter.js +30 -0
- package/dist/stdio-supervisor.d.ts +61 -0
- package/dist/stdio-supervisor.js +326 -9
- package/dist/tool-contract-manifest.d.ts +1 -1
- package/dist/tool-contract-manifest.js +23 -6
- package/dist/tool-guidance.d.ts +82 -0
- package/dist/tool-guidance.js +734 -0
- package/dist/tool-schema-registry.d.ts +16 -0
- package/dist/tool-schema-registry.js +37 -0
- package/dist/tool-schemas.d.ts +3518 -0
- package/dist/tool-schemas.js +813 -0
- package/dist/types.d.ts +36 -0
- package/dist/version-service.js +7 -6
- package/dist/workspace-context-cache.d.ts +32 -0
- package/dist/workspace-context-cache.js +66 -0
- package/dist/workspace-mapping-service.d.ts +16 -0
- package/dist/workspace-mapping-service.js +173 -1
- package/docs/README-ja.md +416 -0
- package/docs/examples.md +483 -0
- package/docs/tool-reference.md +462 -0
- package/package.json +17 -4
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ParsedAccessTransformer } from "../access-transformer-parser.js";
|
|
2
|
+
import type { ParsedAccessWidener } from "../access-widener-parser.js";
|
|
3
|
+
import type { AccessTransformerValidationResult, AccessWidenerValidationResult, ResolvedTargetMembers } from "./types.js";
|
|
4
|
+
export declare function validateParsedAccessWidener(parsed: ParsedAccessWidener, membersByClass: Map<string, ResolvedTargetMembers>, warnings: string[], options?: {
|
|
5
|
+
includeRuntimeEvidence?: boolean;
|
|
6
|
+
}): AccessWidenerValidationResult;
|
|
7
|
+
export declare function validateParsedAccessTransformer(parsed: ParsedAccessTransformer, membersByClass: Map<string, ResolvedTargetMembers>, warnings: string[], options?: {
|
|
8
|
+
includeRuntimeEvidence?: boolean;
|
|
9
|
+
}): AccessTransformerValidationResult;
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import { accessLevelFromFlags, allFieldNames, allMethodNames, suggestSimilar } from "./helpers.js";
|
|
2
|
+
export function validateParsedAccessWidener(parsed, membersByClass, warnings, options) {
|
|
3
|
+
warnings.push(...parsed.parseWarnings);
|
|
4
|
+
const validatedEntries = [];
|
|
5
|
+
let validCount = 0;
|
|
6
|
+
let invalidCount = 0;
|
|
7
|
+
for (const entry of parsed.entries) {
|
|
8
|
+
const ownerFqn = entry.target.replace(/\//g, ".");
|
|
9
|
+
if (entry.targetKind === "class") {
|
|
10
|
+
const members = membersByClass.get(ownerFqn);
|
|
11
|
+
if (members) {
|
|
12
|
+
const runtimeAccess = accessLevelFromFlags(members.classAccessFlags);
|
|
13
|
+
validatedEntries.push({
|
|
14
|
+
...entry,
|
|
15
|
+
valid: true,
|
|
16
|
+
...(options?.includeRuntimeEvidence
|
|
17
|
+
? {
|
|
18
|
+
resolvedInRuntime: true,
|
|
19
|
+
...(runtimeAccess
|
|
20
|
+
? { resolvedRuntimeAccess: runtimeAccess }
|
|
21
|
+
: {})
|
|
22
|
+
}
|
|
23
|
+
: {})
|
|
24
|
+
});
|
|
25
|
+
validCount++;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
validatedEntries.push({
|
|
29
|
+
...entry,
|
|
30
|
+
valid: false,
|
|
31
|
+
issue: `Class "${ownerFqn}" not found in game jar.`,
|
|
32
|
+
...(options?.includeRuntimeEvidence ? { resolvedInRuntime: false } : {})
|
|
33
|
+
});
|
|
34
|
+
invalidCount++;
|
|
35
|
+
}
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
// method or field
|
|
39
|
+
const members = membersByClass.get(ownerFqn);
|
|
40
|
+
if (!members) {
|
|
41
|
+
validatedEntries.push({
|
|
42
|
+
...entry,
|
|
43
|
+
valid: false,
|
|
44
|
+
issue: `Owner class "${ownerFqn}" not found in game jar.`,
|
|
45
|
+
...(options?.includeRuntimeEvidence ? { resolvedInRuntime: false } : {})
|
|
46
|
+
});
|
|
47
|
+
invalidCount++;
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
if (entry.targetKind === "method") {
|
|
51
|
+
const methodNames = allMethodNames(members);
|
|
52
|
+
const matchedMember = members.methods.find((m) => m.name === entry.name && (!entry.descriptor || m.jvmDescriptor === entry.descriptor)) ?? members.constructors.find((m) => m.name === entry.name && (!entry.descriptor || m.jvmDescriptor === entry.descriptor));
|
|
53
|
+
const found = matchedMember != null;
|
|
54
|
+
if (found) {
|
|
55
|
+
const runtimeMember = matchedMember;
|
|
56
|
+
const runtimeAccess = accessLevelFromFlags(runtimeMember.accessFlags);
|
|
57
|
+
validatedEntries.push({
|
|
58
|
+
...entry,
|
|
59
|
+
valid: true,
|
|
60
|
+
...(options?.includeRuntimeEvidence
|
|
61
|
+
? {
|
|
62
|
+
resolvedInRuntime: true,
|
|
63
|
+
...(runtimeAccess
|
|
64
|
+
? { resolvedRuntimeAccess: runtimeAccess }
|
|
65
|
+
: {}),
|
|
66
|
+
...(runtimeMember.jvmDescriptor
|
|
67
|
+
? { resolvedRuntimeJvmDescriptor: runtimeMember.jvmDescriptor }
|
|
68
|
+
: {}),
|
|
69
|
+
...(runtimeMember.javaSignature
|
|
70
|
+
? { resolvedRuntimeJavaSignature: runtimeMember.javaSignature }
|
|
71
|
+
: {})
|
|
72
|
+
}
|
|
73
|
+
: {})
|
|
74
|
+
});
|
|
75
|
+
validCount++;
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
const suggestions = entry.name ? suggestSimilar(entry.name, methodNames) : [];
|
|
79
|
+
validatedEntries.push({
|
|
80
|
+
...entry,
|
|
81
|
+
valid: false,
|
|
82
|
+
issue: `Method "${entry.name}" not found in class "${ownerFqn}".`,
|
|
83
|
+
suggestions: suggestions.length > 0 ? suggestions : undefined,
|
|
84
|
+
...(options?.includeRuntimeEvidence ? { resolvedInRuntime: false } : {})
|
|
85
|
+
});
|
|
86
|
+
invalidCount++;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
// field
|
|
91
|
+
const fieldNames = allFieldNames(members);
|
|
92
|
+
const matchedMember = members.fields.find((m) => m.name === entry.name && (!entry.descriptor || m.jvmDescriptor === entry.descriptor));
|
|
93
|
+
const found = matchedMember != null;
|
|
94
|
+
if (found) {
|
|
95
|
+
const runtimeMember = matchedMember;
|
|
96
|
+
const runtimeAccess = accessLevelFromFlags(runtimeMember.accessFlags);
|
|
97
|
+
validatedEntries.push({
|
|
98
|
+
...entry,
|
|
99
|
+
valid: true,
|
|
100
|
+
...(options?.includeRuntimeEvidence
|
|
101
|
+
? {
|
|
102
|
+
resolvedInRuntime: true,
|
|
103
|
+
...(runtimeAccess
|
|
104
|
+
? { resolvedRuntimeAccess: runtimeAccess }
|
|
105
|
+
: {}),
|
|
106
|
+
...(runtimeMember.jvmDescriptor
|
|
107
|
+
? { resolvedRuntimeJvmDescriptor: runtimeMember.jvmDescriptor }
|
|
108
|
+
: {}),
|
|
109
|
+
...(runtimeMember.javaSignature
|
|
110
|
+
? { resolvedRuntimeJavaSignature: runtimeMember.javaSignature }
|
|
111
|
+
: {})
|
|
112
|
+
}
|
|
113
|
+
: {})
|
|
114
|
+
});
|
|
115
|
+
validCount++;
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
const suggestions = entry.name ? suggestSimilar(entry.name, fieldNames) : [];
|
|
119
|
+
validatedEntries.push({
|
|
120
|
+
...entry,
|
|
121
|
+
valid: false,
|
|
122
|
+
issue: `Field "${entry.name}" not found in class "${ownerFqn}".`,
|
|
123
|
+
suggestions: suggestions.length > 0 ? suggestions : undefined,
|
|
124
|
+
...(options?.includeRuntimeEvidence ? { resolvedInRuntime: false } : {})
|
|
125
|
+
});
|
|
126
|
+
invalidCount++;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
headerVersion: parsed.headerVersion,
|
|
132
|
+
namespace: parsed.namespace,
|
|
133
|
+
valid: invalidCount === 0,
|
|
134
|
+
entries: validatedEntries,
|
|
135
|
+
summary: {
|
|
136
|
+
total: parsed.entries.length,
|
|
137
|
+
valid: validCount,
|
|
138
|
+
invalid: invalidCount
|
|
139
|
+
},
|
|
140
|
+
warnings
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
export function validateParsedAccessTransformer(parsed, membersByClass, warnings, options) {
|
|
144
|
+
warnings.push(...parsed.parseWarnings);
|
|
145
|
+
const validatedEntries = [];
|
|
146
|
+
let validCount = 0;
|
|
147
|
+
let invalidCount = 0;
|
|
148
|
+
for (const entry of parsed.entries) {
|
|
149
|
+
const ownerFqn = entry.owner;
|
|
150
|
+
const members = membersByClass.get(ownerFqn);
|
|
151
|
+
if (entry.targetKind === "class") {
|
|
152
|
+
if (!members) {
|
|
153
|
+
validatedEntries.push({
|
|
154
|
+
...entry,
|
|
155
|
+
valid: false,
|
|
156
|
+
issue: `Class "${ownerFqn}" not found in runtime jar.`,
|
|
157
|
+
...(options?.includeRuntimeEvidence ? { resolvedInRuntime: false } : {})
|
|
158
|
+
});
|
|
159
|
+
invalidCount++;
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
const runtimeAccess = accessLevelFromFlags(members.classAccessFlags);
|
|
163
|
+
validatedEntries.push({
|
|
164
|
+
...entry,
|
|
165
|
+
valid: true,
|
|
166
|
+
...(options?.includeRuntimeEvidence
|
|
167
|
+
? {
|
|
168
|
+
resolvedInRuntime: true,
|
|
169
|
+
...(runtimeAccess ? { resolvedRuntimeAccess: runtimeAccess } : {})
|
|
170
|
+
}
|
|
171
|
+
: {})
|
|
172
|
+
});
|
|
173
|
+
validCount++;
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
if (!members) {
|
|
177
|
+
validatedEntries.push({
|
|
178
|
+
...entry,
|
|
179
|
+
valid: false,
|
|
180
|
+
issue: `Owner class "${ownerFqn}" not found in runtime jar.`,
|
|
181
|
+
...(options?.includeRuntimeEvidence ? { resolvedInRuntime: false } : {})
|
|
182
|
+
});
|
|
183
|
+
invalidCount++;
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
if (entry.targetKind === "field") {
|
|
187
|
+
const fieldNames = allFieldNames(members);
|
|
188
|
+
const matchedField = members.fields.find((member) => member.name === entry.name);
|
|
189
|
+
if (!matchedField) {
|
|
190
|
+
const suggestions = entry.name ? suggestSimilar(entry.name, fieldNames) : [];
|
|
191
|
+
validatedEntries.push({
|
|
192
|
+
...entry,
|
|
193
|
+
valid: false,
|
|
194
|
+
issue: `Field "${entry.name}" not found in class "${ownerFqn}".`,
|
|
195
|
+
...(suggestions.length > 0 ? { suggestions } : {}),
|
|
196
|
+
...(options?.includeRuntimeEvidence ? { resolvedInRuntime: false } : {})
|
|
197
|
+
});
|
|
198
|
+
invalidCount++;
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
const runtimeAccess = accessLevelFromFlags(matchedField.accessFlags);
|
|
202
|
+
validatedEntries.push({
|
|
203
|
+
...entry,
|
|
204
|
+
valid: true,
|
|
205
|
+
...(options?.includeRuntimeEvidence
|
|
206
|
+
? {
|
|
207
|
+
resolvedInRuntime: true,
|
|
208
|
+
...(runtimeAccess ? { resolvedRuntimeAccess: runtimeAccess } : {}),
|
|
209
|
+
...(matchedField.jvmDescriptor ? { resolvedRuntimeJvmDescriptor: matchedField.jvmDescriptor } : {}),
|
|
210
|
+
...(matchedField.javaSignature ? { resolvedRuntimeJavaSignature: matchedField.javaSignature } : {})
|
|
211
|
+
}
|
|
212
|
+
: {})
|
|
213
|
+
});
|
|
214
|
+
validCount++;
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
const methodNames = allMethodNames(members);
|
|
218
|
+
const matchedMethod = members.methods.find((member) => member.name === entry.name && member.jvmDescriptor === entry.descriptor) ?? members.constructors.find((member) => member.name === entry.name && member.jvmDescriptor === entry.descriptor);
|
|
219
|
+
if (!matchedMethod) {
|
|
220
|
+
const suggestions = entry.name ? suggestSimilar(entry.name, methodNames) : [];
|
|
221
|
+
validatedEntries.push({
|
|
222
|
+
...entry,
|
|
223
|
+
valid: false,
|
|
224
|
+
issue: `Method "${entry.name}" not found in class "${ownerFqn}".`,
|
|
225
|
+
...(suggestions.length > 0 ? { suggestions } : {}),
|
|
226
|
+
...(options?.includeRuntimeEvidence ? { resolvedInRuntime: false } : {})
|
|
227
|
+
});
|
|
228
|
+
invalidCount++;
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
const runtimeAccess = accessLevelFromFlags(matchedMethod.accessFlags);
|
|
232
|
+
validatedEntries.push({
|
|
233
|
+
...entry,
|
|
234
|
+
valid: true,
|
|
235
|
+
...(options?.includeRuntimeEvidence
|
|
236
|
+
? {
|
|
237
|
+
resolvedInRuntime: true,
|
|
238
|
+
...(runtimeAccess ? { resolvedRuntimeAccess: runtimeAccess } : {}),
|
|
239
|
+
...(matchedMethod.jvmDescriptor ? { resolvedRuntimeJvmDescriptor: matchedMethod.jvmDescriptor } : {}),
|
|
240
|
+
...(matchedMethod.javaSignature ? { resolvedRuntimeJavaSignature: matchedMethod.javaSignature } : {})
|
|
241
|
+
}
|
|
242
|
+
: {})
|
|
243
|
+
});
|
|
244
|
+
validCount++;
|
|
245
|
+
}
|
|
246
|
+
return {
|
|
247
|
+
valid: invalidCount === 0,
|
|
248
|
+
entries: validatedEntries,
|
|
249
|
+
summary: {
|
|
250
|
+
total: parsed.entries.length,
|
|
251
|
+
valid: validCount,
|
|
252
|
+
invalid: invalidCount
|
|
253
|
+
},
|
|
254
|
+
warnings
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=access-validators.js.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ParsedAccessor, ParsedInjection, ParsedShadow } from "../mixin-parser.js";
|
|
2
|
+
import type { IssueConfidence, MappingHealthReport, ResolvedMember, ResolvedTargetMembers, ValidationIssue } from "./types.js";
|
|
3
|
+
export declare function validateInjection(inj: ParsedInjection, targetMembers: Map<string, ResolvedTargetMembers>, targetNames: string[], issues: ValidationIssue[], resolvedMembers: ResolvedMember[], confidence?: IssueConfidence, confidenceReason?: string, remapFailedMembers?: Map<string, Set<string>>, signatureFailedTargets?: Set<string>, healthReport?: MappingHealthReport): void;
|
|
4
|
+
export declare function validateShadow(shadow: ParsedShadow, targetMembers: Map<string, ResolvedTargetMembers>, targetNames: string[], issues: ValidationIssue[], resolvedMembers: ResolvedMember[], confidence?: IssueConfidence, confidenceReason?: string, remapFailedMembers?: Map<string, Set<string>>, signatureFailedTargets?: Set<string>, healthReport?: MappingHealthReport): void;
|
|
5
|
+
export declare function validateAccessor(accessor: ParsedAccessor, targetMembers: Map<string, ResolvedTargetMembers>, targetNames: string[], issues: ValidationIssue[], resolvedMembers: ResolvedMember[], confidence?: IssueConfidence, confidenceReason?: string, remapFailedMembers?: Map<string, Set<string>>, signatureFailedTargets?: Set<string>, healthReport?: MappingHealthReport): void;
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { allFieldNames, allMethodNames, computeFalsePositiveRisk, extractMethodDescriptor, extractMethodName, suggestSimilar } from "./helpers.js";
|
|
2
|
+
export function validateInjection(inj, targetMembers, targetNames, issues, resolvedMembers, confidence, confidenceReason, remapFailedMembers, signatureFailedTargets, healthReport) {
|
|
3
|
+
for (const targetName of targetNames) {
|
|
4
|
+
const members = targetMembers.get(targetName);
|
|
5
|
+
if (!members)
|
|
6
|
+
continue;
|
|
7
|
+
const methodNames = allMethodNames(members);
|
|
8
|
+
// Strip owner prefix and JVM descriptor from the method reference
|
|
9
|
+
const methodName = extractMethodName(inj.method);
|
|
10
|
+
if (!methodNames.includes(methodName)) {
|
|
11
|
+
const suggestions = suggestSimilar(methodName, methodNames);
|
|
12
|
+
const descriptor = extractMethodDescriptor(inj.method);
|
|
13
|
+
const descriptorHint = descriptor ? ` (descriptor: ${descriptor})` : "";
|
|
14
|
+
// Determine if this is a remap artifact or signature unavailability
|
|
15
|
+
const isRemapFailed = remapFailedMembers?.get(targetName)?.has(methodName);
|
|
16
|
+
const isSigFailed = signatureFailedTargets?.has(targetName);
|
|
17
|
+
const issueConfidence = isRemapFailed ? "uncertain" : confidence;
|
|
18
|
+
const issueConfidenceReason = isRemapFailed
|
|
19
|
+
? `Member remap from obfuscated→mapping failed; name mismatch may be a remap artifact, not a true missing member.`
|
|
20
|
+
: confidenceReason;
|
|
21
|
+
const resolutionPath = isRemapFailed
|
|
22
|
+
? "member-remap-failed"
|
|
23
|
+
: isSigFailed ? "source-signature-unavailable" : undefined;
|
|
24
|
+
const memberDegraded = isRemapFailed && healthReport?.memberRemapAvailable === false;
|
|
25
|
+
issues.push({
|
|
26
|
+
severity: memberDegraded ? "warning" : "error",
|
|
27
|
+
kind: "method-not-found",
|
|
28
|
+
annotation: `@${inj.annotation}`,
|
|
29
|
+
target: `${targetName}#${inj.method}`,
|
|
30
|
+
message: `Method "${methodName}" not found in target class "${targetName}".${descriptorHint}${memberDegraded ? " (infrastructure degraded; may be false positive)" : ""}`,
|
|
31
|
+
suggestions: suggestions.length > 0 ? suggestions : undefined,
|
|
32
|
+
line: inj.line,
|
|
33
|
+
confidence: issueConfidence,
|
|
34
|
+
confidenceReason: issueConfidenceReason,
|
|
35
|
+
resolutionPath,
|
|
36
|
+
falsePositiveRisk: computeFalsePositiveRisk(healthReport, resolutionPath, issueConfidence)
|
|
37
|
+
});
|
|
38
|
+
resolvedMembers.push({
|
|
39
|
+
annotation: `@${inj.annotation}`,
|
|
40
|
+
name: methodName,
|
|
41
|
+
line: inj.line,
|
|
42
|
+
status: "not-found"
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
resolvedMembers.push({
|
|
47
|
+
annotation: `@${inj.annotation}`,
|
|
48
|
+
name: methodName,
|
|
49
|
+
line: inj.line,
|
|
50
|
+
resolvedTo: `${targetName}#${methodName}`,
|
|
51
|
+
status: "resolved"
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export function validateShadow(shadow, targetMembers, targetNames, issues, resolvedMembers, confidence, confidenceReason, remapFailedMembers, signatureFailedTargets, healthReport) {
|
|
57
|
+
for (const targetName of targetNames) {
|
|
58
|
+
const members = targetMembers.get(targetName);
|
|
59
|
+
if (!members)
|
|
60
|
+
continue;
|
|
61
|
+
const isRemapFailed = remapFailedMembers?.get(targetName)?.has(shadow.name);
|
|
62
|
+
const isSigFailed = signatureFailedTargets?.has(targetName);
|
|
63
|
+
const issueConfidence = isRemapFailed ? "uncertain" : confidence;
|
|
64
|
+
const issueConfidenceReason = isRemapFailed
|
|
65
|
+
? `Member remap from obfuscated→mapping failed; name mismatch may be a remap artifact, not a true missing member.`
|
|
66
|
+
: confidenceReason;
|
|
67
|
+
const resolutionPath = isRemapFailed
|
|
68
|
+
? "member-remap-failed"
|
|
69
|
+
: isSigFailed ? "source-signature-unavailable" : undefined;
|
|
70
|
+
const memberDegraded = isRemapFailed && healthReport?.memberRemapAvailable === false;
|
|
71
|
+
if (shadow.kind === "field") {
|
|
72
|
+
const fieldNames = allFieldNames(members);
|
|
73
|
+
if (!fieldNames.includes(shadow.name)) {
|
|
74
|
+
const suggestions = suggestSimilar(shadow.name, fieldNames);
|
|
75
|
+
issues.push({
|
|
76
|
+
severity: memberDegraded ? "warning" : "error",
|
|
77
|
+
kind: "field-not-found",
|
|
78
|
+
annotation: "@Shadow",
|
|
79
|
+
target: `${targetName}#${shadow.name}`,
|
|
80
|
+
message: `Field "${shadow.name}" not found in target class "${targetName}" (${fieldNames.length} field(s) available).${memberDegraded ? " (infrastructure degraded; may be false positive)" : ""}`,
|
|
81
|
+
suggestions: suggestions.length > 0 ? suggestions : undefined,
|
|
82
|
+
line: shadow.line,
|
|
83
|
+
confidence: issueConfidence,
|
|
84
|
+
confidenceReason: issueConfidenceReason,
|
|
85
|
+
resolutionPath,
|
|
86
|
+
falsePositiveRisk: computeFalsePositiveRisk(healthReport, resolutionPath, issueConfidence)
|
|
87
|
+
});
|
|
88
|
+
resolvedMembers.push({ annotation: "@Shadow", name: shadow.name, line: shadow.line, status: "not-found" });
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
resolvedMembers.push({ annotation: "@Shadow", name: shadow.name, line: shadow.line, resolvedTo: `${targetName}#${shadow.name}`, status: "resolved" });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
const methodNames = allMethodNames(members);
|
|
96
|
+
if (!methodNames.includes(shadow.name)) {
|
|
97
|
+
const suggestions = suggestSimilar(shadow.name, methodNames);
|
|
98
|
+
issues.push({
|
|
99
|
+
severity: memberDegraded ? "warning" : "error",
|
|
100
|
+
kind: "method-not-found",
|
|
101
|
+
annotation: "@Shadow",
|
|
102
|
+
target: `${targetName}#${shadow.name}`,
|
|
103
|
+
message: `Method "${shadow.name}" not found in target class "${targetName}" (${methodNames.length} method(s) available).${memberDegraded ? " (infrastructure degraded; may be false positive)" : ""}`,
|
|
104
|
+
suggestions: suggestions.length > 0 ? suggestions : undefined,
|
|
105
|
+
line: shadow.line,
|
|
106
|
+
confidence: issueConfidence,
|
|
107
|
+
confidenceReason: issueConfidenceReason,
|
|
108
|
+
resolutionPath,
|
|
109
|
+
falsePositiveRisk: computeFalsePositiveRisk(healthReport, resolutionPath, issueConfidence)
|
|
110
|
+
});
|
|
111
|
+
resolvedMembers.push({ annotation: "@Shadow", name: shadow.name, line: shadow.line, status: "not-found" });
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
resolvedMembers.push({ annotation: "@Shadow", name: shadow.name, line: shadow.line, resolvedTo: `${targetName}#${shadow.name}`, status: "resolved" });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
export function validateAccessor(accessor, targetMembers, targetNames, issues, resolvedMembers, confidence, confidenceReason, remapFailedMembers, signatureFailedTargets, healthReport) {
|
|
120
|
+
for (const targetName of targetNames) {
|
|
121
|
+
const members = targetMembers.get(targetName);
|
|
122
|
+
if (!members)
|
|
123
|
+
continue;
|
|
124
|
+
const candidateNames = accessor.annotation === "Invoker"
|
|
125
|
+
? allMethodNames(members)
|
|
126
|
+
: allFieldNames(members);
|
|
127
|
+
if (!candidateNames.includes(accessor.targetName)) {
|
|
128
|
+
const isRemapFailed = remapFailedMembers?.get(targetName)?.has(accessor.targetName);
|
|
129
|
+
const isSigFailed = signatureFailedTargets?.has(targetName);
|
|
130
|
+
const issueConfidence = isRemapFailed ? "uncertain" : confidence;
|
|
131
|
+
const issueConfidenceReason = isRemapFailed
|
|
132
|
+
? `Member remap from obfuscated→mapping failed; name mismatch may be a remap artifact, not a true missing member.`
|
|
133
|
+
: confidenceReason;
|
|
134
|
+
const resolutionPath = isRemapFailed
|
|
135
|
+
? "member-remap-failed"
|
|
136
|
+
: isSigFailed ? "source-signature-unavailable" : undefined;
|
|
137
|
+
const memberDegraded = isRemapFailed && healthReport?.memberRemapAvailable === false;
|
|
138
|
+
const suggestions = suggestSimilar(accessor.targetName, candidateNames);
|
|
139
|
+
const inferenceHint = accessor.targetName !== accessor.name
|
|
140
|
+
? ` (inferred "${accessor.targetName}" from "${accessor.name}" via prefix removal)`
|
|
141
|
+
: "";
|
|
142
|
+
issues.push({
|
|
143
|
+
severity: memberDegraded ? "warning" : "error",
|
|
144
|
+
kind: accessor.annotation === "Invoker" ? "method-not-found" : "field-not-found",
|
|
145
|
+
annotation: `@${accessor.annotation}`,
|
|
146
|
+
target: `${targetName}#${accessor.targetName}`,
|
|
147
|
+
message: `Target "${accessor.targetName}" not found in class "${targetName}".${inferenceHint}${memberDegraded ? " (infrastructure degraded; may be false positive)" : ""}`,
|
|
148
|
+
suggestions: suggestions.length > 0 ? suggestions : undefined,
|
|
149
|
+
line: accessor.line,
|
|
150
|
+
confidence: issueConfidence,
|
|
151
|
+
confidenceReason: issueConfidenceReason,
|
|
152
|
+
resolutionPath,
|
|
153
|
+
falsePositiveRisk: computeFalsePositiveRisk(healthReport, resolutionPath, issueConfidence)
|
|
154
|
+
});
|
|
155
|
+
resolvedMembers.push({ annotation: `@${accessor.annotation}`, name: accessor.targetName, line: accessor.line, status: "not-found" });
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
resolvedMembers.push({ annotation: `@${accessor.annotation}`, name: accessor.targetName, line: accessor.line, resolvedTo: `${targetName}#${accessor.targetName}`, status: "resolved" });
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=annotation-validators.js.map
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ParsedMixin } from "../mixin-parser.js";
|
|
2
|
+
import type { ConfidenceBreakdown, IssueConfidence, MappingHealthReport, MixinValidationProvenance, MixinValidationResult, ResolutionPath, ResolvedMember, ResolvedTargetMembers, StructuredWarning, ValidationStatus, ValidationSummary } from "./types.js";
|
|
3
|
+
export declare const TOOL_RESOLUTION_PATHS: ResolutionPath[];
|
|
4
|
+
export declare function classifyStructuredWarning(message: string): StructuredWarning;
|
|
5
|
+
export declare function levenshteinDistance(a: string, b: string): number;
|
|
6
|
+
export declare function suggestSimilar(name: string, candidates: string[], maxDistance?: number, maxResults?: number): string[];
|
|
7
|
+
export declare function extractMethodName(ref: string): string;
|
|
8
|
+
/**
|
|
9
|
+
* Extract the JVM descriptor portion from a method reference, if present.
|
|
10
|
+
*
|
|
11
|
+
* Examples:
|
|
12
|
+
* "playerTouch(Lnet/minecraft/world/entity/player/Player;)V" → "(Lnet/minecraft/world/entity/player/Player;)V"
|
|
13
|
+
* "tick" → undefined
|
|
14
|
+
*/
|
|
15
|
+
export declare function extractMethodDescriptor(ref: string): string | undefined;
|
|
16
|
+
export declare function allMethodNames(members: ResolvedTargetMembers): string[];
|
|
17
|
+
export declare function allFieldNames(members: ResolvedTargetMembers): string[];
|
|
18
|
+
export declare function accessLevelFromFlags(accessFlags: number | undefined): "public" | "protected" | "private" | "package-private" | undefined;
|
|
19
|
+
export declare function computeFalsePositiveRisk(healthReport: MappingHealthReport | undefined, resolutionPath: ResolutionPath | undefined, issueConfidence: IssueConfidence | undefined): "high" | "medium" | "low" | undefined;
|
|
20
|
+
export declare function computeConfidenceBreakdown(healthReport: MappingHealthReport | undefined, provenance: MixinValidationProvenance | undefined, remapFailureCount: number, skippedMemberCount: number): ConfidenceBreakdown;
|
|
21
|
+
export declare function summarizeResolvedMembers(resolvedMembers: ResolvedMember[]): Pick<ValidationSummary, "membersValidated" | "membersSkipped" | "membersMissing">;
|
|
22
|
+
export declare function computeValidationStatus(summary: ValidationSummary): ValidationStatus;
|
|
23
|
+
export declare function buildQuickSummary(status: ValidationStatus, summary: ValidationSummary, context?: {
|
|
24
|
+
provenance?: MixinValidationProvenance;
|
|
25
|
+
healthReport?: MappingHealthReport;
|
|
26
|
+
}): string;
|
|
27
|
+
export declare function addSkippedMembers(parsed: ParsedMixin, resolvedMembers: ResolvedMember[]): void;
|
|
28
|
+
export declare function refreshMixinValidationOutcome(result: MixinValidationResult): MixinValidationResult;
|