1- import { FileOptions , Targets } from "." ;
2- import { clExtensions , clleTargetCallback } from "./languages/clle" ;
3- import { ddsExtension , ddsTargetCallback } from "./languages/dds" ;
4- import { rpgExtensions , rpgleTargetParser } from "./languages/rpgle" ;
5- import { sqlExtensions , sqlTargetCallback } from "./languages/sql" ;
6- import { binderExtensions , binderTargetCallback } from "./languages/binder" ;
7- import { cmdExtensions , cmdTargetCallback } from "./languages/cmd" ;
8- import { noSourceObjects , noSourceTargetCallback } from "./languages/nosrc" ;
1+ import { FileOptions , ObjectType , Targets } from "." ;
2+ import { clExtensions , clleTargetCallback , clObjects } from "./languages/clle" ;
3+ import { ddsExtension , ddsObjects , ddsTargetCallback } from "./languages/dds" ;
4+ import { rpgExtensions , rpgleTargetParser , rpgObjects } from "./languages/rpgle" ;
5+ import { sqlExtensions , sqlObjects , sqlTargetCallback } from "./languages/sql" ;
6+ import { binderExtensions , binderObjects , binderTargetCallback } from "./languages/binder" ;
7+ import { cmdExtensions , cmdObjects , cmdTargetCallback } from "./languages/cmd" ;
8+ import { noSourceObjects , noSourceTargetCallback , noSourceTargetObjects } from "./languages/nosrc" ;
99
1010export type LanguageCallback = ( targets : Targets , relativePath : string , content : string , options : FileOptions ) => Promise < void >
1111interface LanguageGroup {
1212 extensions : string [ ] ;
1313 callback : LanguageCallback ;
1414}
1515
16+ export type ExtensionMap = { [ ext : string ] : ObjectType } ;
17+
1618export class TargetsLanguageProvider {
17- private languages : LanguageGroup [ ] = [
18- { extensions : clExtensions , callback : clleTargetCallback } ,
19- { extensions : sqlExtensions , callback : sqlTargetCallback } ,
20- { extensions : ddsExtension , callback : ddsTargetCallback } ,
21- { extensions : binderExtensions , callback : binderTargetCallback } ,
22- { extensions : cmdExtensions , callback : cmdTargetCallback } ,
23- { extensions : noSourceObjects , callback : noSourceTargetCallback }
24- ] ;
19+ private languageTargets : LanguageGroup [ ] = [ ] ;
20+ private extensionMap : ExtensionMap = { } ;
2521
2622 constructor ( private readonly targets : Targets ) {
2723 const rpgleTargets = new rpgleTargetParser ( this . targets ) ;
28- this . languages . push ( {
29- extensions : rpgExtensions ,
30- callback : ( targets , relativePath , content , options ) => {
31- return rpgleTargets . rpgleTargetCallback ( targets , relativePath , content , options ) ;
32- }
33- } )
24+
25+ this . registerLanguage ( clExtensions , clleTargetCallback , clObjects ) ;
26+ this . registerLanguage ( sqlExtensions , sqlTargetCallback , sqlObjects ) ;
27+ this . registerLanguage ( ddsExtension , ddsTargetCallback , ddsObjects ) ;
28+ this . registerLanguage ( binderExtensions , binderTargetCallback , binderObjects ) ;
29+ this . registerLanguage ( cmdExtensions , cmdTargetCallback , cmdObjects ) ;
30+ this . registerLanguage ( noSourceObjects , noSourceTargetCallback , noSourceTargetObjects ) ;
31+
32+ this . registerLanguage ( rpgExtensions , ( targets , relativePath , content , options ) => {
33+ return rpgleTargets . rpgleTargetCallback ( targets , relativePath , content , options ) ;
34+ } , rpgObjects ) ;
3435 }
3536
3637 public getExtensions ( ) {
37- return this . languages . map ( lang => lang . extensions ) . flat ( ) ;
38+ return this . languageTargets . map ( lang => lang . extensions ) . flat ( ) ;
3839 }
3940
4041 public getGlob ( ) {
@@ -44,19 +45,25 @@ export class TargetsLanguageProvider {
4445
4546 public async handleLanguage ( relativePath : string , content : string , options : FileOptions = { } ) {
4647 const ext = relativePath . split ( '.' ) . pop ( ) ?. toLowerCase ( ) ;
47- const language = this . languages . find ( lang => lang . extensions . includes ( ext ) ) ;
48+ const language = this . languageTargets . find ( lang => lang . extensions . includes ( ext ) ) ;
4849 if ( ext && language ) {
4950 await language . callback ( this . targets , relativePath , content , options ) ;
5051 }
5152 }
5253
53- public registerLanguage ( extensions : string [ ] , callback : LanguageCallback ) {
54+ public registerLanguage ( extensions : string [ ] , callback : LanguageCallback , objectTypes : ExtensionMap = { } ) {
5455 for ( const ext of extensions ) {
55- if ( this . languages . some ( lang => lang . extensions . includes ( ext ) ) ) {
56+ if ( this . languageTargets . some ( lang => lang . extensions . includes ( ext ) ) ) {
5657 throw new Error ( `Language with extension '${ ext } ' is already registered.` ) ;
5758 }
5859 }
5960
60- this . languages . push ( { extensions, callback} ) ;
61+ this . extensionMap = { ...this . extensionMap , ...objectTypes } ;
62+
63+ this . languageTargets . push ( { extensions, callback} ) ;
64+ }
65+
66+ public getObjectType ( ext : string ) : ObjectType | undefined {
67+ return this . extensionMap [ ext . toLowerCase ( ) ] ;
6168 }
6269}
0 commit comments