@shapeshift-labs/frontier-lang-compiler 0.2.106 → 0.2.107

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.
@@ -76,6 +76,9 @@ export interface TypeScriptCompilerNativeImporterAdapterOptions {
76
76
  readonly diagnostics?: readonly NativeImporterAdapterDiagnostic[];
77
77
  readonly typescript?: unknown;
78
78
  readonly ts?: unknown;
79
+ readonly program?: { readonly getTypeChecker?: () => unknown } | unknown;
80
+ readonly typeChecker?: unknown;
81
+ readonly checker?: unknown;
79
82
  readonly sourceFile?: unknown;
80
83
  readonly createSourceFile?: (input: NativeImporterAdapterParseInput, typescript?: unknown) => unknown;
81
84
  readonly scriptTarget?: unknown;
@@ -25,6 +25,8 @@ export function createTypeScriptCompilerNativeImporterAdapter(options = {}) {
25
25
  diagnostics: options.diagnostics,
26
26
  parse(input) {
27
27
  const ts = options.typescript ?? options.ts ?? input.options?.typescript ?? input.options?.ts;
28
+ const program = options.program ?? input.options?.program;
29
+ const typeChecker = options.typeChecker ?? options.checker ?? input.options?.typeChecker ?? input.options?.checker ?? program?.getTypeChecker?.();
28
30
  const sourceFile = input.options?.sourceFile ?? input.options?.ast ?? options.sourceFile ?? createTypeScriptSourceFile(ts, input, options);
29
31
  if (!sourceFile) {
30
32
  return missingInjectedParserResult(input, {
@@ -37,6 +39,8 @@ export function createTypeScriptCompilerNativeImporterAdapter(options = {}) {
37
39
  parser: options.parser ?? 'typescript-compiler-api',
38
40
  astFormat: 'typescript-compiler-api',
39
41
  ts,
42
+ program,
43
+ typeChecker,
40
44
  maxNodes: options.maxNodes,
41
45
  includeTokens: options.includeTokens
42
46
  });
@@ -35,6 +35,7 @@ export function semanticIndexFromNativeDeclarations(declarations, input, options
35
35
  };
36
36
  declaration.nativeNode.metadata = {
37
37
  ...declaration.nativeNode.metadata,
38
+ ...declaration.metadata,
38
39
  ownershipRegionId: ownershipRegion.id,
39
40
  ownershipRegionKey: ownershipRegion.key,
40
41
  ownershipRegionKind: ownershipRegion.regionKind,
@@ -47,7 +48,7 @@ export function semanticIndexFromNativeDeclarations(declarations, input, options
47
48
  kind: declaration.symbolKind,
48
49
  language: input.language,
49
50
  nativeAstNodeId: declaration.nativeNode.id,
50
- signatureHash: hashSemanticValue([input.language, declaration.nativeNode.kind, declaration.name, declaration.nativeNode.fields ?? {}]),
51
+ signatureHash: declaration.signatureHash ?? hashSemanticValue([input.language, declaration.nativeNode.kind, declaration.name, declaration.nativeNode.fields ?? {}]),
51
52
  definitionSpan: declaration.nativeNode.span,
52
53
  metadata: {
53
54
  ...declaration.nativeNode.metadata,
@@ -1,14 +1,67 @@
1
- import{declarationRecord}from'./declarationRecord.js';import{namedDeclaration}from'./namedDeclaration.js';import{nativeNodeId}from'./nativeNodeId.js';import{stringFromTsExpression}from'./stringFromTsExpression.js';
2
- export function typeScriptDeclaration(node, kind, nativeNodeId, input) {
1
+ import{hashSemanticValue}from'@shapeshift-labs/frontier-lang-kernel';import{idFragment}from'../../native-import-utils.js';
2
+ import{declarationRecord}from'./declarationRecord.js';import{identifierName}from'./identifierName.js';import{namedDeclaration}from'./namedDeclaration.js';import{stringFromTsExpression}from'./stringFromTsExpression.js';
3
+ export function typeScriptDeclaration(node, kind, nativeNodeId, input, options = {}) {
4
+ const enrich = (declaration, symbolNode = node.name ?? node) => enrichTypeScriptDeclaration(node, symbolNode, declaration, input, options);
3
5
  if (kind === 'ImportDeclaration' || kind === 'ImportEqualsDeclaration') {
4
6
  const name = stringFromTsExpression(node.moduleSpecifier) ?? stringFromTsExpression(node.externalModuleReference?.expression);
5
- if (name) return declarationRecord(input, nativeNodeId, name, 'module', 'import');
7
+ if (name) return enrich(declarationRecord(input, nativeNodeId, name, 'module', 'import'), node.moduleSpecifier ?? node.externalModuleReference?.expression ?? node);
6
8
  }
7
- if (kind === 'FunctionDeclaration') return namedDeclaration(input, nativeNodeId, node.name, 'function');
8
- if (kind === 'ClassDeclaration') return namedDeclaration(input, nativeNodeId, node.name, 'class');
9
- if (kind === 'InterfaceDeclaration') return namedDeclaration(input, nativeNodeId, node.name, 'interface');
10
- if (kind === 'TypeAliasDeclaration' || kind === 'EnumDeclaration') return namedDeclaration(input, nativeNodeId, node.name, 'type');
11
- if (kind === 'VariableDeclaration') return namedDeclaration(input, nativeNodeId, node.name, 'variable');
12
- if (kind === 'MethodDeclaration' || kind === 'MethodSignature') return namedDeclaration(input, nativeNodeId, node.name, 'method');
9
+ if (kind === 'FunctionDeclaration') return enrich(namedDeclaration(input, nativeNodeId, node.name, 'function'));
10
+ if (kind === 'ClassDeclaration') return enrich(namedDeclaration(input, nativeNodeId, node.name, 'class'));
11
+ if (kind === 'InterfaceDeclaration') return enrich(namedDeclaration(input, nativeNodeId, node.name, 'interface'));
12
+ if (kind === 'TypeAliasDeclaration' || kind === 'EnumDeclaration') return enrich(namedDeclaration(input, nativeNodeId, node.name, 'type'));
13
+ if (kind === 'VariableDeclaration') return enrich(namedDeclaration(input, nativeNodeId, node.name, 'variable'));
14
+ if (kind === 'MethodDeclaration' || kind === 'MethodSignature') return enrich(namedDeclaration(input, nativeNodeId, node.name, 'method'));
13
15
  return undefined;
14
16
  }
17
+
18
+ function enrichTypeScriptDeclaration(node, symbolNode, declaration, input, options) {
19
+ if (!declaration) return declaration;
20
+ const checker = options.typeChecker ?? options.checker ?? options.program?.getTypeChecker?.();
21
+ const symbol = safeCall(checker?.getSymbolAtLocation, checker, symbolNode) ?? safeCall(checker?.getSymbolAtLocation, checker, node.name);
22
+ if (!symbol) return declaration;
23
+ const aliasedSymbol = safeCall(checker?.getAliasedSymbol, checker, symbol);
24
+ const targetSymbol = aliasedSymbol && aliasedSymbol !== symbol ? aliasedSymbol : undefined;
25
+ const identitySymbol = targetSymbol ?? symbol;
26
+ const fullyQualifiedName = stringValue(safeCall(checker?.getFullyQualifiedName, checker, identitySymbol));
27
+ const localName = stringValue(symbol.escapedName ?? symbol.name) ?? declaration.name;
28
+ const targetName = targetSymbol ? stringValue(targetSymbol.escapedName ?? targetSymbol.name) : undefined;
29
+ const identity = fullyQualifiedName ?? targetName ?? localName;
30
+ const compilerSymbol = compactRecord({
31
+ parser: options.parser,
32
+ localName,
33
+ targetName,
34
+ fullyQualifiedName,
35
+ flags: numberValue(symbol.flags),
36
+ targetFlags: numberValue(targetSymbol?.flags),
37
+ declarations: Array.isArray(identitySymbol.declarations) ? identitySymbol.declarations.length : undefined,
38
+ aliased: Boolean(targetSymbol)
39
+ });
40
+ return {
41
+ ...declaration,
42
+ symbolId: `symbol:${input.language}:compiler:${declaration.role === 'import' ? 'import:' : ''}${idFragment(identity)}`,
43
+ signatureHash: hashSemanticValue([input.language, declaration.symbolKind, identity, compilerSymbol]),
44
+ metadata: {
45
+ ...declaration.metadata,
46
+ compilerSymbol,
47
+ compilerSymbolIdentityHash: hashSemanticValue(compilerSymbol)
48
+ }
49
+ };
50
+ }
51
+
52
+ function safeCall(fn, receiver, ...args) {
53
+ if (typeof fn !== 'function') return undefined;
54
+ try { return fn.apply(receiver, args); } catch { return undefined; }
55
+ }
56
+
57
+ function stringValue(value) {
58
+ return value === undefined || value === null || value === '' ? undefined : String(value);
59
+ }
60
+
61
+ function numberValue(value) {
62
+ return Number.isFinite(value) ? value : undefined;
63
+ }
64
+
65
+ function compactRecord(record) {
66
+ return Object.fromEntries(Object.entries(record).filter(([, value]) => value !== undefined));
67
+ }
@@ -33,6 +33,7 @@ export function visitTypeScriptAstNode(node, sourceFile, context, propertyPath,
33
33
  fields: primitiveTypeScriptFields(node, kind),
34
34
  children,
35
35
  metadata: {
36
+ ...declaration?.metadata,
36
37
  astFormat: context.options.astFormat,
37
38
  propertyPath,
38
39
  pos: numberOrUndefined(node.pos),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shapeshift-labs/frontier-lang-compiler",
3
- "version": "0.2.106",
3
+ "version": "0.2.107",
4
4
  "description": "Compiler facade for Frontier Lang source documents and language projection adapters.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",