Skip to content

Commit 3fccc49

Browse files
authored
Extractor (#158)
1 parent aa86a9d commit 3fccc49

File tree

3 files changed

+107
-0
lines changed

3 files changed

+107
-0
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { describe, test } from "@std/testing/bdd";
2+
import { expect } from "@std/expect";
3+
import { getJavaFilesContentMap } from "../testFiles/index.ts";
4+
import { generateJavaDependencyManifest } from "../../../manifest/dependencyManifest/java/index.ts";
5+
import { JavaExtractor } from "./index.ts";
6+
import { WORMKILLER } from "../testFiles/constants.ts";
7+
8+
describe("Java extractor", () => {
9+
const files = getJavaFilesContentMap();
10+
const manifest = generateJavaDependencyManifest(files);
11+
const extractor = new JavaExtractor(files, manifest);
12+
test("extracts wormkiller", () => {
13+
const symbolsMap: Map<string, { filePath: string; symbols: Set<string> }> =
14+
new Map();
15+
symbolsMap.set(WORMKILLER, {
16+
filePath: WORMKILLER,
17+
symbols: new Set("Wormkiller"),
18+
});
19+
const extracted = extractor.extractSymbols(symbolsMap);
20+
expect(extracted.size).toBe(4);
21+
});
22+
});
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import type Parser from "tree-sitter";
2+
import type { DependencyManifest } from "../../../manifest/dependencyManifest/types.ts";
3+
import { JavaInvocationResolver } from "../invocationResolver/index.ts";
4+
import { javaParser } from "../../../helpers/treeSitter/parsers.ts";
5+
import { JavaPackageMapper } from "../packageMapper/index.ts";
6+
import { JavaImportResolver } from "../importResolver/index.ts";
7+
import { ExportedFile } from "./types.ts";
8+
9+
export class JavaExtractor {
10+
manifest: DependencyManifest;
11+
resolver: JavaInvocationResolver;
12+
constructor(
13+
files: Map<string, { path: string; content: string }>,
14+
manifest: DependencyManifest,
15+
) {
16+
this.manifest = manifest;
17+
const parsedFiles = new Map<
18+
string,
19+
{ path: string; rootNode: Parser.SyntaxNode }
20+
>();
21+
for (const [filepath, file] of files) {
22+
parsedFiles.set(filepath, {
23+
path: file.path,
24+
rootNode: javaParser.parse(file.content).rootNode,
25+
});
26+
}
27+
const mapper = new JavaPackageMapper(parsedFiles);
28+
const importresolver = new JavaImportResolver(mapper);
29+
this.resolver = new JavaInvocationResolver(importresolver);
30+
}
31+
32+
extractSymbols(
33+
symbolsMap: Map<
34+
string,
35+
{
36+
filePath: string;
37+
symbols: Set<string>;
38+
}
39+
>,
40+
): Map<string, { path: string; content: string }> {
41+
const exportedfiles = Array.from(
42+
symbolsMap.keys().map((k) => new ExportedFile(k, this.resolver)),
43+
);
44+
const filesToKeep: Map<string, { path: string; content: string }> =
45+
new Map();
46+
for (const f of exportedfiles) {
47+
if (!filesToKeep.has(f.file.path)) {
48+
filesToKeep.set(f.file.path, {
49+
path: f.file.path,
50+
content: f.file.rootNode.text,
51+
});
52+
}
53+
for (const [k, v] of f.dependencies) {
54+
if (!filesToKeep.has(k)) {
55+
filesToKeep.set(k, {
56+
path: v.path,
57+
content: v.rootNode.text,
58+
});
59+
}
60+
}
61+
}
62+
return filesToKeep;
63+
}
64+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import type { JavaInvocationResolver } from "../invocationResolver/index.ts";
2+
import type { JavaFile } from "../packageResolver/types.ts";
3+
4+
export class ExportedFile {
5+
dependencies: Map<string, JavaFile>;
6+
file: JavaFile;
7+
constructor(filepath: string, resolver: JavaInvocationResolver) {
8+
this.file = resolver.mapper.files.get(filepath)!;
9+
this.dependencies = new Map();
10+
const stack = [this.file];
11+
while (stack.length > 0) {
12+
const current = stack.pop()!;
13+
if (this.dependencies.has(current.path)) {
14+
continue;
15+
}
16+
this.dependencies.set(current.path, current);
17+
const currentDep = resolver.getInvocations(current).resolved;
18+
stack.push(...currentDep.values().map((v) => v.file));
19+
}
20+
}
21+
}

0 commit comments

Comments
 (0)