@adhisang/minecraft-modding-mcp 1.2.1 → 2.1.0
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 +73 -0
- package/README.md +184 -64
- package/dist/cli.js +31 -4
- package/dist/compat-stdio-transport.d.ts +2 -7
- package/dist/compat-stdio-transport.js +12 -154
- package/dist/index.js +537 -202
- package/dist/json-rpc-framing.d.ts +22 -0
- package/dist/json-rpc-framing.js +168 -0
- package/dist/mapping-pipeline-service.d.ts +1 -1
- package/dist/mapping-pipeline-service.js +13 -5
- package/dist/mapping-service.d.ts +12 -4
- package/dist/mapping-service.js +222 -105
- package/dist/mcp-helpers.d.ts +10 -2
- package/dist/mcp-helpers.js +59 -5
- package/dist/minecraft-explorer-service.d.ts +1 -2
- package/dist/minecraft-explorer-service.js +120 -24
- package/dist/mixin-validator.d.ts +24 -2
- package/dist/mixin-validator.js +228 -103
- package/dist/mod-decompile-service.d.ts +5 -0
- package/dist/mod-decompile-service.js +40 -5
- package/dist/mod-remap-service.js +142 -30
- package/dist/mojang-tiny-mapping-service.js +26 -26
- package/dist/path-resolver.js +41 -4
- package/dist/registry-service.d.ts +10 -1
- package/dist/registry-service.js +154 -22
- package/dist/resources.js +7 -7
- package/dist/search-hit-accumulator.d.ts +0 -3
- package/dist/search-hit-accumulator.js +27 -6
- package/dist/source-jar-reader.js +16 -2
- package/dist/source-resolver.d.ts +1 -0
- package/dist/source-resolver.js +93 -2
- package/dist/source-service.d.ts +76 -47
- package/dist/source-service.js +1344 -763
- package/dist/stdio-supervisor.d.ts +46 -0
- package/dist/stdio-supervisor.js +349 -0
- package/dist/storage/files-repo.d.ts +3 -0
- package/dist/storage/files-repo.js +66 -1
- package/dist/storage/migrations.d.ts +1 -1
- package/dist/storage/migrations.js +6 -2
- package/dist/storage/schema.d.ts +1 -0
- package/dist/storage/schema.js +7 -0
- package/dist/symbols/symbol-extractor.js +6 -4
- package/dist/tool-execution-gate.d.ts +15 -0
- package/dist/tool-execution-gate.js +58 -0
- package/dist/tool-input.d.ts +6 -0
- package/dist/tool-input.js +64 -0
- package/dist/types.d.ts +1 -1
- package/dist/version-diff-service.js +10 -5
- package/dist/version-service.js +7 -2
- package/dist/workspace-mapping-service.js +12 -0
- package/package.json +4 -1
package/dist/mcp-helpers.d.ts
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import type { CallToolResult, ReadResourceResult } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
-
|
|
2
|
+
import { type ErrorCode } from "./errors.js";
|
|
3
|
+
type ObjectResultOptions = {
|
|
4
|
+
isError?: boolean;
|
|
5
|
+
};
|
|
6
|
+
export declare function objectResult<T extends Record<string, unknown>>(data: T, options?: ObjectResultOptions): CallToolResult;
|
|
3
7
|
export declare function textResource(uri: string, value: string): ReadResourceResult;
|
|
4
8
|
export declare function objectResource(uri: string, data: Record<string, unknown>): ReadResourceResult;
|
|
5
|
-
export declare function errorResource(uri: string,
|
|
9
|
+
export declare function errorResource(uri: string, error: string | {
|
|
10
|
+
message: string;
|
|
11
|
+
code?: ErrorCode;
|
|
12
|
+
}): ReadResourceResult;
|
|
13
|
+
export {};
|
package/dist/mcp-helpers.js
CHANGED
|
@@ -1,13 +1,67 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { ERROR_CODES } from "./errors.js";
|
|
2
|
+
export function objectResult(data, options = {}) {
|
|
3
|
+
return {
|
|
4
|
+
content: [{ type: "text", text: JSON.stringify(data) }],
|
|
5
|
+
structuredContent: data,
|
|
6
|
+
...(options.isError ? { isError: true } : {})
|
|
7
|
+
};
|
|
3
8
|
}
|
|
4
9
|
export function textResource(uri, value) {
|
|
5
10
|
return { contents: [{ uri, text: value }] };
|
|
6
11
|
}
|
|
7
12
|
export function objectResource(uri, data) {
|
|
8
|
-
return {
|
|
13
|
+
return {
|
|
14
|
+
contents: [
|
|
15
|
+
{
|
|
16
|
+
uri,
|
|
17
|
+
mimeType: "application/json",
|
|
18
|
+
text: JSON.stringify({
|
|
19
|
+
result: data,
|
|
20
|
+
meta: { uri }
|
|
21
|
+
})
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
};
|
|
9
25
|
}
|
|
10
|
-
|
|
11
|
-
|
|
26
|
+
function statusForResourceErrorCode(code) {
|
|
27
|
+
if (code === ERROR_CODES.INVALID_INPUT) {
|
|
28
|
+
return 400;
|
|
29
|
+
}
|
|
30
|
+
if (code === ERROR_CODES.FILE_NOT_FOUND ||
|
|
31
|
+
code === ERROR_CODES.SOURCE_NOT_FOUND ||
|
|
32
|
+
code === ERROR_CODES.CLASS_NOT_FOUND ||
|
|
33
|
+
code === ERROR_CODES.VERSION_NOT_FOUND ||
|
|
34
|
+
code === ERROR_CODES.JAR_NOT_FOUND) {
|
|
35
|
+
return 404;
|
|
36
|
+
}
|
|
37
|
+
if (code === ERROR_CODES.MAPPING_UNAVAILABLE ||
|
|
38
|
+
code === ERROR_CODES.MAPPING_NOT_APPLIED ||
|
|
39
|
+
code === ERROR_CODES.NAMESPACE_MISMATCH) {
|
|
40
|
+
return 422;
|
|
41
|
+
}
|
|
42
|
+
return 500;
|
|
43
|
+
}
|
|
44
|
+
export function errorResource(uri, error) {
|
|
45
|
+
const detail = typeof error === "string" ? error : error.message;
|
|
46
|
+
const code = typeof error === "string" ? ERROR_CODES.INVALID_INPUT : error.code ?? ERROR_CODES.INTERNAL;
|
|
47
|
+
return {
|
|
48
|
+
contents: [
|
|
49
|
+
{
|
|
50
|
+
uri,
|
|
51
|
+
mimeType: "application/json",
|
|
52
|
+
text: JSON.stringify({
|
|
53
|
+
error: {
|
|
54
|
+
type: "https://minecraft-modding-mcp.dev/problems/resource",
|
|
55
|
+
title: "Resource read failed",
|
|
56
|
+
detail,
|
|
57
|
+
status: statusForResourceErrorCode(code),
|
|
58
|
+
code,
|
|
59
|
+
instance: uri
|
|
60
|
+
},
|
|
61
|
+
meta: { uri }
|
|
62
|
+
})
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
};
|
|
12
66
|
}
|
|
13
67
|
//# sourceMappingURL=mcp-helpers.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Config } from "./types.js";
|
|
2
|
-
export type MappingNamespace = "
|
|
2
|
+
export type MappingNamespace = "obfuscated" | "mojang" | "yarn";
|
|
3
3
|
type SignatureAccess = "public" | "all";
|
|
4
4
|
export interface ResponseContext {
|
|
5
5
|
minecraftVersion: string;
|
|
@@ -38,6 +38,5 @@ export declare class MinecraftExplorerService {
|
|
|
38
38
|
getSignature(input: GetSignatureInput): Promise<GetSignatureOutput>;
|
|
39
39
|
private contextForJar;
|
|
40
40
|
private normalizeJarPathOrThrow;
|
|
41
|
-
private trimSignatureCache;
|
|
42
41
|
}
|
|
43
42
|
export {};
|
|
@@ -68,7 +68,7 @@ function modifierPrefix(flags, category) {
|
|
|
68
68
|
}
|
|
69
69
|
return parts.join(" ");
|
|
70
70
|
}
|
|
71
|
-
function parseFieldType(descriptor, position = 0) {
|
|
71
|
+
function parseFieldType(descriptor, position = 0, options = {}) {
|
|
72
72
|
if (position >= descriptor.length) {
|
|
73
73
|
throw createError({
|
|
74
74
|
code: ERROR_CODES.INVALID_INPUT,
|
|
@@ -95,6 +95,13 @@ function parseFieldType(descriptor, position = 0) {
|
|
|
95
95
|
case "Z":
|
|
96
96
|
return { type: "boolean", next: position + 1 };
|
|
97
97
|
case "V":
|
|
98
|
+
if (!options.allowVoid) {
|
|
99
|
+
throw createError({
|
|
100
|
+
code: ERROR_CODES.INVALID_INPUT,
|
|
101
|
+
message: options.invalidVoidMessage ?? `Invalid field descriptor "${descriptor}".`,
|
|
102
|
+
details: { descriptor, position }
|
|
103
|
+
});
|
|
104
|
+
}
|
|
98
105
|
return { type: "void", next: position + 1 };
|
|
99
106
|
case "L": {
|
|
100
107
|
const end = descriptor.indexOf(";", position);
|
|
@@ -109,7 +116,7 @@ function parseFieldType(descriptor, position = 0) {
|
|
|
109
116
|
return { type, next: end + 1 };
|
|
110
117
|
}
|
|
111
118
|
case "[": {
|
|
112
|
-
const inner = parseFieldType(descriptor, position + 1);
|
|
119
|
+
const inner = parseFieldType(descriptor, position + 1, options);
|
|
113
120
|
return { type: `${inner.type}[]`, next: inner.next };
|
|
114
121
|
}
|
|
115
122
|
default:
|
|
@@ -131,7 +138,10 @@ function parseMethodDescriptor(descriptor) {
|
|
|
131
138
|
const args = [];
|
|
132
139
|
let cursor = 1;
|
|
133
140
|
while (cursor < descriptor.length && descriptor[cursor] !== ")") {
|
|
134
|
-
const parsed = parseFieldType(descriptor, cursor
|
|
141
|
+
const parsed = parseFieldType(descriptor, cursor, {
|
|
142
|
+
allowVoid: false,
|
|
143
|
+
invalidVoidMessage: `Invalid method descriptor "${descriptor}": void is not allowed in this position.`
|
|
144
|
+
});
|
|
135
145
|
args.push(parsed.type);
|
|
136
146
|
cursor = parsed.next;
|
|
137
147
|
}
|
|
@@ -142,7 +152,15 @@ function parseMethodDescriptor(descriptor) {
|
|
|
142
152
|
details: { descriptor, cursor }
|
|
143
153
|
});
|
|
144
154
|
}
|
|
145
|
-
const
|
|
155
|
+
const parsedReturn = parseFieldType(descriptor, cursor + 1, { allowVoid: true });
|
|
156
|
+
if (parsedReturn.next !== descriptor.length) {
|
|
157
|
+
throw createError({
|
|
158
|
+
code: ERROR_CODES.INVALID_INPUT,
|
|
159
|
+
message: `Invalid method descriptor "${descriptor}".`,
|
|
160
|
+
details: { descriptor, cursor: parsedReturn.next }
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
const returnType = parsedReturn.type;
|
|
146
164
|
return { args, returnType };
|
|
147
165
|
}
|
|
148
166
|
function hasPublicVisibility(flags) {
|
|
@@ -154,6 +172,80 @@ function toInternalName(fqn) {
|
|
|
154
172
|
function extractVersionFromPath(inputPath) {
|
|
155
173
|
return inputPath.match(/(\d+\.\d+(?:\.\d+)?)/)?.[1];
|
|
156
174
|
}
|
|
175
|
+
class SignatureCacheStore {
|
|
176
|
+
maxEntries;
|
|
177
|
+
nodes = new Map();
|
|
178
|
+
oldest;
|
|
179
|
+
newest;
|
|
180
|
+
constructor(maxEntries) {
|
|
181
|
+
this.maxEntries = maxEntries;
|
|
182
|
+
}
|
|
183
|
+
get(key) {
|
|
184
|
+
const node = this.nodes.get(key);
|
|
185
|
+
if (!node) {
|
|
186
|
+
return undefined;
|
|
187
|
+
}
|
|
188
|
+
this.promote(node);
|
|
189
|
+
return node.value;
|
|
190
|
+
}
|
|
191
|
+
set(key, value) {
|
|
192
|
+
const existing = this.nodes.get(key);
|
|
193
|
+
if (existing) {
|
|
194
|
+
existing.value = value;
|
|
195
|
+
this.promote(existing);
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
const node = { key, value, older: this.newest };
|
|
199
|
+
if (this.newest) {
|
|
200
|
+
this.newest.newer = node;
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
this.oldest = node;
|
|
204
|
+
}
|
|
205
|
+
this.newest = node;
|
|
206
|
+
this.nodes.set(key, node);
|
|
207
|
+
while (this.nodes.size > this.maxEntries) {
|
|
208
|
+
this.evictOldest();
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
promote(node) {
|
|
212
|
+
if (this.newest === node) {
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
if (node.older) {
|
|
216
|
+
node.older.newer = node.newer;
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
this.oldest = node.newer;
|
|
220
|
+
}
|
|
221
|
+
if (node.newer) {
|
|
222
|
+
node.newer.older = node.older;
|
|
223
|
+
}
|
|
224
|
+
node.older = this.newest;
|
|
225
|
+
node.newer = undefined;
|
|
226
|
+
if (this.newest) {
|
|
227
|
+
this.newest.newer = node;
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
this.oldest = node;
|
|
231
|
+
}
|
|
232
|
+
this.newest = node;
|
|
233
|
+
}
|
|
234
|
+
evictOldest() {
|
|
235
|
+
const node = this.oldest;
|
|
236
|
+
if (!node) {
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
this.oldest = node.newer;
|
|
240
|
+
if (this.oldest) {
|
|
241
|
+
this.oldest.older = undefined;
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
this.newest = undefined;
|
|
245
|
+
}
|
|
246
|
+
this.nodes.delete(node.key);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
157
249
|
class ByteReader {
|
|
158
250
|
offset = 0;
|
|
159
251
|
buffer;
|
|
@@ -321,9 +413,10 @@ function parseClassFile(buffer) {
|
|
|
321
413
|
}
|
|
322
414
|
export class MinecraftExplorerService {
|
|
323
415
|
config;
|
|
324
|
-
signatureCache
|
|
416
|
+
signatureCache;
|
|
325
417
|
constructor(explicitConfig) {
|
|
326
418
|
this.config = explicitConfig ?? loadConfig();
|
|
419
|
+
this.signatureCache = new SignatureCacheStore(Math.max(1, this.config.maxSignatureCache ?? 2_000));
|
|
327
420
|
}
|
|
328
421
|
async getSignature(input) {
|
|
329
422
|
const jarPath = this.normalizeJarPathOrThrow(input.jarPath);
|
|
@@ -348,10 +441,11 @@ export class MinecraftExplorerService {
|
|
|
348
441
|
].join("|");
|
|
349
442
|
const cached = this.signatureCache.get(cacheKey);
|
|
350
443
|
if (cached) {
|
|
351
|
-
this.signatureCache.delete(cacheKey);
|
|
352
|
-
this.signatureCache.set(cacheKey, cached);
|
|
353
444
|
return {
|
|
354
|
-
|
|
445
|
+
constructors: cached.constructors,
|
|
446
|
+
methods: cached.methods,
|
|
447
|
+
fields: cached.fields,
|
|
448
|
+
warnings: cached.warnings,
|
|
355
449
|
context: this.contextForJar(jarPath)
|
|
356
450
|
};
|
|
357
451
|
}
|
|
@@ -446,7 +540,15 @@ export class MinecraftExplorerService {
|
|
|
446
540
|
}
|
|
447
541
|
const toSignatureMember = (ownerFqn, ownerSimpleClassName, member, category) => {
|
|
448
542
|
if (category === "field") {
|
|
449
|
-
const
|
|
543
|
+
const parsedField = parseFieldType(member.descriptor, 0, { allowVoid: false });
|
|
544
|
+
if (parsedField.next !== member.descriptor.length) {
|
|
545
|
+
throw createError({
|
|
546
|
+
code: ERROR_CODES.INVALID_INPUT,
|
|
547
|
+
message: `Invalid field descriptor "${member.descriptor}".`,
|
|
548
|
+
details: { descriptor: member.descriptor, position: parsedField.next }
|
|
549
|
+
});
|
|
550
|
+
}
|
|
551
|
+
const fieldType = parsedField.type;
|
|
450
552
|
const modifiers = modifierPrefix(member.accessFlags, "field");
|
|
451
553
|
return {
|
|
452
554
|
ownerFqn,
|
|
@@ -520,18 +622,22 @@ export class MinecraftExplorerService {
|
|
|
520
622
|
constructors,
|
|
521
623
|
methods,
|
|
522
624
|
fields,
|
|
523
|
-
warnings
|
|
524
|
-
context: this.contextForJar(jarPath)
|
|
625
|
+
warnings
|
|
525
626
|
};
|
|
526
627
|
this.signatureCache.set(cacheKey, output);
|
|
527
|
-
|
|
528
|
-
|
|
628
|
+
return {
|
|
629
|
+
constructors: output.constructors,
|
|
630
|
+
methods: output.methods,
|
|
631
|
+
fields: output.fields,
|
|
632
|
+
warnings: output.warnings,
|
|
633
|
+
context: this.contextForJar(jarPath)
|
|
634
|
+
};
|
|
529
635
|
}
|
|
530
636
|
contextForJar(jarPath) {
|
|
531
637
|
return {
|
|
532
638
|
minecraftVersion: extractVersionFromPath(jarPath) ?? "unknown",
|
|
533
639
|
mappingType: "unknown",
|
|
534
|
-
mappingNamespace: "
|
|
640
|
+
mappingNamespace: "obfuscated",
|
|
535
641
|
jarHash: artifactSignatureFromFile(jarPath).sourceArtifactId,
|
|
536
642
|
generatedAt: new Date().toISOString()
|
|
537
643
|
};
|
|
@@ -548,15 +654,5 @@ export class MinecraftExplorerService {
|
|
|
548
654
|
});
|
|
549
655
|
}
|
|
550
656
|
}
|
|
551
|
-
trimSignatureCache() {
|
|
552
|
-
const maxEntries = Math.max(1, this.config.maxSignatureCache ?? 2_000);
|
|
553
|
-
while (this.signatureCache.size > maxEntries) {
|
|
554
|
-
const oldest = this.signatureCache.keys().next().value;
|
|
555
|
-
if (!oldest) {
|
|
556
|
-
return;
|
|
557
|
-
}
|
|
558
|
-
this.signatureCache.delete(oldest);
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
657
|
}
|
|
562
658
|
//# sourceMappingURL=minecraft-explorer-service.js.map
|
|
@@ -16,10 +16,11 @@ export type MappingHealthReport = {
|
|
|
16
16
|
degradations: string[];
|
|
17
17
|
};
|
|
18
18
|
export type IssueConfidence = "definite" | "likely" | "uncertain";
|
|
19
|
+
export type ValidationStatus = "full" | "partial" | "invalid";
|
|
19
20
|
export type ResolutionPath = "member-remap-failed" | "target-mapping-failed" | "target-class-missing" | "source-signature-unavailable";
|
|
20
21
|
export type ValidationIssue = {
|
|
21
22
|
severity: "error" | "warning";
|
|
22
|
-
kind: "target-not-found" | "target-mapping-failed" | "method-not-found" | "field-not-found" | "descriptor-mismatch" | "access-mismatch" | "unknown-annotation";
|
|
23
|
+
kind: "target-not-found" | "validation-incomplete" | "target-mapping-failed" | "method-not-found" | "field-not-found" | "descriptor-mismatch" | "access-mismatch" | "unknown-annotation";
|
|
23
24
|
annotation: string;
|
|
24
25
|
target: string;
|
|
25
26
|
message: string;
|
|
@@ -42,6 +43,9 @@ export type ValidationSummary = {
|
|
|
42
43
|
shadows: number;
|
|
43
44
|
accessors: number;
|
|
44
45
|
total: number;
|
|
46
|
+
membersValidated: number;
|
|
47
|
+
membersSkipped: number;
|
|
48
|
+
membersMissing: number;
|
|
45
49
|
errors: number;
|
|
46
50
|
warnings: number;
|
|
47
51
|
definiteErrors: number;
|
|
@@ -54,8 +58,12 @@ export type MixinValidationProvenance = {
|
|
|
54
58
|
jarPath: string;
|
|
55
59
|
requestedMapping: SourceMapping;
|
|
56
60
|
mappingApplied: SourceMapping;
|
|
61
|
+
requestedScope?: "vanilla" | "merged" | "loader";
|
|
62
|
+
appliedScope?: "vanilla" | "merged" | "loader";
|
|
63
|
+
requestedSourcePriority?: "loom-first" | "maven-first";
|
|
64
|
+
appliedSourcePriority?: "loom-first" | "maven-first";
|
|
57
65
|
resolutionNotes?: string[];
|
|
58
|
-
jarType?: "vanilla-client" | "merged" | "unknown";
|
|
66
|
+
jarType?: "vanilla-client" | "merged" | "loader" | "unknown";
|
|
59
67
|
mappingChain?: string[];
|
|
60
68
|
remapFailures?: number;
|
|
61
69
|
mappingAutoDetected?: boolean;
|
|
@@ -91,11 +99,23 @@ export type AggregatedWarningGroup = {
|
|
|
91
99
|
count: number;
|
|
92
100
|
samples: string[];
|
|
93
101
|
};
|
|
102
|
+
export type ConfidencePenalty = {
|
|
103
|
+
reason: string;
|
|
104
|
+
points: number;
|
|
105
|
+
};
|
|
106
|
+
export type ConfidenceBreakdown = {
|
|
107
|
+
baseScore: number;
|
|
108
|
+
score: number;
|
|
109
|
+
penalties: ConfidencePenalty[];
|
|
110
|
+
};
|
|
94
111
|
export type MixinValidationResult = {
|
|
95
112
|
className: string;
|
|
96
113
|
targets: string[];
|
|
97
114
|
priority?: number;
|
|
115
|
+
/** Legacy coarse pass/fail flag. Prefer validationStatus for the primary outcome. */
|
|
98
116
|
valid: boolean;
|
|
117
|
+
/** full = fully validated, partial = tool-limited/incomplete, invalid = definite validation errors. */
|
|
118
|
+
validationStatus: ValidationStatus;
|
|
99
119
|
issues: ValidationIssue[];
|
|
100
120
|
summary: ValidationSummary;
|
|
101
121
|
unfilteredSummary?: ValidationSummary;
|
|
@@ -106,6 +126,7 @@ export type MixinValidationResult = {
|
|
|
106
126
|
resolvedMembers?: ResolvedMember[];
|
|
107
127
|
toolHealth?: MappingHealthReport;
|
|
108
128
|
confidenceScore?: number;
|
|
129
|
+
confidenceBreakdown?: ConfidenceBreakdown;
|
|
109
130
|
quickSummary?: string;
|
|
110
131
|
};
|
|
111
132
|
export type ResolvedTargetMembers = {
|
|
@@ -141,6 +162,7 @@ export declare function extractMethodName(ref: string): string;
|
|
|
141
162
|
* "tick" → undefined
|
|
142
163
|
*/
|
|
143
164
|
export declare function extractMethodDescriptor(ref: string): string | undefined;
|
|
165
|
+
export declare function refreshMixinValidationOutcome(result: MixinValidationResult): MixinValidationResult;
|
|
144
166
|
export declare function validateParsedMixin(parsed: ParsedMixin, targetMembers: Map<string, ResolvedTargetMembers>, warnings: string[], provenance?: MixinValidationProvenance, confidence?: IssueConfidence, mappingFailedTargets?: Set<string>, explain?: boolean, remapFailedMembers?: Map<string, Set<string>>, signatureFailedTargets?: Set<string>, suggestedCallContext?: {
|
|
145
167
|
scope?: string;
|
|
146
168
|
sourcePriority?: string;
|