Skip to content

Commit 5d42e3b

Browse files
committed
Object types come from registered languages
Signed-off-by: worksofliam <[email protected]>
1 parent 53c87cf commit 5d42e3b

File tree

11 files changed

+95
-170
lines changed

11 files changed

+95
-170
lines changed

cli/src/builders/environment.ts

Lines changed: 0 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,6 @@ export function getBranchLibraryName(currentBranch: string) {
4040
return `VS${(str(currentBranch, 0) >>> 0).toString(16).toUpperCase()}`;
4141
}
4242

43-
export function extCanBeProgram(ext: string): boolean {
44-
return ([`MODULE`, `PGM`].includes(getObjectType(ext)));
45-
}
46-
4743
export function getTrueBasename(name: string) {
4844
// Logic to handle second extension, caused by bob.
4945
const sourceObjectTypes = [`.PGM`, `.SRVPGM`, `.TEST`];
@@ -60,55 +56,6 @@ export function getTrueBasename(name: string) {
6056
return name;
6157
}
6258

63-
export function getObjectType(ext: string): ObjectType {
64-
switch (ext.toLowerCase()) {
65-
case `dspf`:
66-
case `prtf`:
67-
case `pf`:
68-
case `lf`:
69-
case `sql`:
70-
case `table`:
71-
case `view`:
72-
case `index`:
73-
case `alias`:
74-
case `sqludf`:
75-
case `sqludt`:
76-
case `sqlalias`:
77-
case `sqlseq`:
78-
case `sequence`:
79-
case `msgf`:
80-
return "FILE";
81-
82-
case `dtaara`:
83-
return "DTAARA";
84-
85-
case `cmd`:
86-
return "CMD";
87-
88-
case `rpgle`:
89-
case `sqlrpgle`:
90-
case `clle`:
91-
case `cl`:
92-
return "MODULE";
93-
94-
case `binder`:
95-
case `bnd`:
96-
case `function`:
97-
return `SRVPGM`;
98-
99-
case `procedure`:
100-
case `trigger`:
101-
case `sqlprc`:
102-
case `sqltrg`:
103-
return `PGM`;
104-
105-
case `bnddir`:
106-
return `BNDDIR`;
107-
}
108-
109-
return undefined;
110-
}
111-
11259
export function getDefaultCompiles(): CompileAttribute {
11360
const binderSourceCompile: CompileData = {
11461
becomes: `SRVPGM`,

cli/src/languages/rpgle.ts

Lines changed: 0 additions & 78 deletions
This file was deleted.

cli/src/targets/index.ts

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,9 @@
11
import path from 'path';
2-
import Cache from "vscode-rpgle/language/models/cache";
3-
import { IncludeStatement } from "vscode-rpgle/language/parserTypes";
4-
import { infoOut, warningOut } from '../cli';
5-
import { DefinitionType, File, Module, CLParser } from 'vscode-clle/language';
6-
import { DisplayFile as dds } from "vscode-displayfile/src/dspf";
2+
import { infoOut } from '../cli';
73
import Document from "vscode-db2i/src/language/sql/document";
84
import { ObjectRef, StatementType } from 'vscode-db2i/src/language/sql/types';
9-
import Parser from "vscode-rpgle/language/parser";
10-
import { setupParser } from '../languages/rpgle';
115
import { Logger } from '../logger';
12-
import { asPosix, getReferenceObjectsFrom, getSystemNameFromPath, globalEntryIsValid, toLocalPath, trimQuotes } from '../utils';
13-
import { extCanBeProgram, getObjectType } from '../builders/environment';
14-
import { isSqlFunction } from '../languages/sql';
6+
import { getReferenceObjectsFrom, getSystemNameFromPath, globalEntryIsValid, toLocalPath } from '../utils';
157
import { ReadFileSystem } from '../readFileSystem';
168
import { TargetsLanguageProvider } from './languages';
179
import { sqlExtensions } from './languages/sql';
@@ -150,6 +142,10 @@ export class Targets {
150142
await Promise.allSettled(initialFiles.map(f => this.parseFile(f)));
151143
}
152144

145+
private extCanBeProgram(ext: string): boolean {
146+
return [`MODULE`, `PGM`].includes(this.languageProvider.getObjectType(ext));
147+
}
148+
153149
public async resolvePathToObject(localPath: string, newText?: string) {
154150
if (this.resolvedObjects[localPath]) {
155151
if (newText) this.resolvedObjects[localPath].text = newText;
@@ -161,7 +157,7 @@ export class Targets {
161157

162158
const extension = detail.ext.length > 1 ? detail.ext.substring(1) : detail.ext;
163159
const hasProgramAttribute = detail.name.toUpperCase().endsWith(`.PGM`);
164-
const isProgram = this.assumePrograms ? extCanBeProgram(extension) : hasProgramAttribute;
160+
const isProgram = this.assumePrograms ? this.extCanBeProgram(extension) : hasProgramAttribute;
165161
const name = getSystemNameFromPath(hasProgramAttribute ? detail.name.substring(0, detail.name.length - 4) : detail.name);
166162
const type: ObjectType = (isProgram ? "PGM" : this.getObjectType(relativePath, extension));
167163

@@ -335,7 +331,7 @@ export class Targets {
335331

336332
// TODO: move this to language provider
337333
getObjectType(relativePath: string, ext: string): ObjectType {
338-
const objType = getObjectType(ext);
334+
const objType = this.languageProvider.getObjectType(ext);
339335

340336
if (!objType) {
341337
this.logger.fileLog(relativePath, {

cli/src/targets/languages.ts

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,41 @@
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

1010
export type LanguageCallback = (targets: Targets, relativePath: string, content: string, options: FileOptions) => Promise<void>
1111
interface LanguageGroup {
1212
extensions: string[];
1313
callback: LanguageCallback;
1414
}
1515

16+
export type ExtensionMap = {[ext: string]: ObjectType};
17+
1618
export 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
}

cli/src/targets/languages/binder.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,13 @@ import { CLParser, DefinitionType, Module, File } from "vscode-clle/language";
33
import { FileOptions, ILEObjectTarget, Targets } from "..";
44
import { infoOut } from "../../cli";
55
import { trimQuotes } from "../../utils";
6+
import { ExtensionMap } from "../languages";
67

78
export const binderExtensions = [`binder`, `bnd`];
9+
export const binderObjects: ExtensionMap = {
10+
binder: `SRVPGM`,
11+
bnd: `SRVPGM`,
12+
}
813

914
export async function binderTargetCallback(targets: Targets, localPath: string, content: string, options: FileOptions) {
1015
const clDocs = new CLParser();

cli/src/targets/languages/clle.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,14 @@ import path from "path";
22
import { CLParser, DefinitionType, Module, File } from "vscode-clle/language";
33
import { FileOptions, ILEObjectTarget, Targets } from "..";
44
import { infoOut } from "../../cli";
5+
import { ExtensionMap } from "../languages";
56

67
export const clExtensions = [`clle`, `cl`, `clp`];
8+
export const clObjects: ExtensionMap = {
9+
clle: `MODULE`,
10+
cl: `MODULE`,
11+
clp: `PGM`
12+
}
713

814
export async function clleTargetCallback(targets: Targets, filePath: string, content: string, options: FileOptions) {
915
const clDocs = new CLParser();

cli/src/targets/languages/cmd.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import { FileOptions, Targets } from "..";
2+
import { ExtensionMap } from "../languages";
23

34
export const cmdExtensions = [`cmd`];
5+
export const cmdObjects: ExtensionMap = {
6+
cmd: `CMD`
7+
}
48

59
export async function cmdTargetCallback(targets: Targets, localPath: string, content: string, options: FileOptions) {
610
targets.resolvePathToObject(localPath, options.text);

cli/src/targets/languages/dds.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,15 @@ import path from "path";
22
import { DisplayFile as dds } from "vscode-displayfile/src/dspf";
33
import { FileOptions, ILEObjectTarget, Targets } from "..";
44
import { infoOut } from "../../cli";
5+
import { ExtensionMap } from "../languages";
56

67
export const ddsExtension = [`pf`, `lf`, `dspf`, `prtf`];
8+
export const ddsObjects: ExtensionMap = {
9+
pf: `FILE`,
10+
lf: `FILE`,
11+
dspf: `FILE`,
12+
prtf: `FILE`
13+
}
714

815
export async function ddsTargetCallback(targets: Targets, filePath: string, content: string, options: FileOptions) {
916
const eol = content.indexOf(`\r\n`) >= 0 ? `\r\n` : `\n`;

cli/src/targets/languages/nosrc.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
import { Targets, FileOptions } from "..";
2+
import { ExtensionMap } from "../languages";
23

34
export const noSourceObjects = [`dtaara`, `mnucmd`, `msgf`, `dtaq`, `bnddir`];
5+
export const noSourceTargetObjects: ExtensionMap = {
6+
dtaara: `DTAARA`,
7+
mnucmd: `CMD`,
8+
msgf: `FILE`,
9+
dtaq: `DTAQ`,
10+
bnddir: `BNDDIR`
11+
}
412

513
export async function noSourceTargetCallback(targets: Targets, localPath: string, content: string, options: FileOptions) {
614
targets.resolvePathToObject(localPath, options.text);

cli/src/targets/languages/rpgle.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,13 @@ import Parser from "vscode-rpgle/language/parser";
55
import { IncludeStatement } from "vscode-rpgle/language/parserTypes";
66
import { asPosix, toLocalPath, trimQuotes } from "../../utils";
77
import { isSqlFunction } from "../../languages/sql";
8+
import { ExtensionMap } from "../languages";
89

910
export const rpgExtensions = [`sqlrpgle`, `rpgle`];
11+
export const rpgObjects: ExtensionMap = {
12+
sqlrpgle: `MODULE`,
13+
rpgle: `MODULE`,
14+
}
1015

1116
interface RpgLookup {
1217
lookup: string,

0 commit comments

Comments
 (0)