Before adding a new language
- check if the language is already supported by tree-sitter
- check the wasm file of tree-sitter grammar exist in https://github.com/unit-mesh/treesitter-artifacts
- our version treesiter playground: https://unit-mesh.github.io/treesitter-artifacts/
Add a New Language
If you want to add a new language support, you can follow the steps below:
- Create a new file in
src/code-context/${your-newlanguage}
folder, for example,src/code-context/java
. - Implement the following interfaces:
LanguageProfile.ts
, core configuration for the languageRelevantCodeProvider.ts
, which will provider the related code for the codeBaseStructurerProvider.ts
, which will provider the UML for simplifying the codeTestGenProvider.ts
, which will provider the test generation for the code
- Add to
ProviderContainer.config.ts
, for example: ```typescript providerContainer.bind(IToolchainContextProvider).to(SpringContextProvider); providerContainer.bind(IToolchainContextProvider).to(JavaVersionProvider);
providerContainer.bind(IRelevantCodeProvider).to(JavaRelevantCodeProvider); providerContainer.bind(ITestGenProvider).to(JavaTestGenProvider); providerContainer.bind(IBuildToolProvider).to(GradleBuildToolProvider); providerContainer.bind(IStructurerProvider).to(JavaStructurerProvider);
### LanguageConfig example
```typescript
export interface LanguageProfile {
// A list of language names that can be processed by these node queries
// e.g.: ["Typescript", "TSX"], ["Rust"]
languageIds: string[];
// Extensions that can help classify the file: .rs, .rb, .cabal
fileExtensions: string[];
// tree-sitter grammar for this language
grammar: (langService: ILanguageServiceProvider, langId?: LanguageIdentifier) => Promise<Language | undefined>;
// Compiled tree-sitter node query for this language.
scopeQuery: MemoizedQuery;
// Compiled tree-sitter hoverables query
hoverableQuery: MemoizedQuery;
// in java, the canonical name is the package name
packageQuery?: MemoizedQuery;
// class query
classQuery: MemoizedQuery;
// method query
methodQuery: MemoizedQuery;
blockCommentQuery: MemoizedQuery;
// method input and output query
methodIOQuery?: MemoizedQuery;
fieldQuery?: MemoizedQuery;
// structurer query
structureQuery: MemoizedQuery;
// Namespaces defined by this language,
// E.g.: type namespace, variable namespace, function namespace
namespaces: NameSpaces;
// should select parent
// for example, in JavaScript/TypeScript, if we select function, we should also select the export keyword.
autoSelectInsideParent: string[];
/// for IO analysis
builtInTypes: string[];
// should return true if the file is a test file
isTestFile: (filePath: string) => boolean;
}