@ibm/sourceorbit
Version:
IBM i dependency management tool
126 lines (125 loc) • 4.52 kB
TypeScript
import { ObjectRef } from 'vscode-db2i/src/language/sql/types';
import { Logger } from './logger';
import { ReadFileSystem } from './readFileSystem';
export type ObjectType = "PGM" | "SRVPGM" | "MODULE" | "FILE" | "BNDDIR" | "DTAARA" | "CMD" | "MENU" | "DTAQ";
export interface ILEObject {
systemName: string;
longName?: string;
type: ObjectType;
text?: string;
relativePath?: string;
extension?: string;
reference?: boolean;
/** exported functions */
exports?: string[];
/** each function import in the object */
imports?: string[];
/** headers. only supports RPGLE and is not recursive */
headers?: string[];
}
export interface ILEObjectTarget extends ILEObject {
deps: ILEObject[];
}
export interface TargetSuggestions {
renames?: boolean;
includes?: boolean;
}
export interface ImpactedObject {
ileObject: ILEObject;
children: ImpactedObject[];
}
/**
* This class is responsible for storing all the targets
* and their dependencies. It also handles the parsing
* of files and the creation of targets.
*
* const files = getAllFilesInDir(`.`);
* const targets = new Targets(cwd);
* targets.handlePseudoFile(pseudoFilePath);
* targets.loadObjectsFromPaths(files);
* await Promise.all(files.map(f => targets.parseFile(f)));
* targets.resolveBinder();
*/
export declare class Targets {
private cwd;
private fs;
private rpgParser;
private pathCache;
private resolvedSearches;
private assumePrograms;
private resolvedObjects;
private resolvedExports;
private targets;
private needsBinder;
private projectBindingDirectory;
private suggestions;
logger: Logger;
constructor(cwd: string, fs: ReadFileSystem);
getCwd(): string;
get rfs(): ReadFileSystem;
setAssumePrograms(assumePrograms: boolean): void;
setSuggestions(newSuggestions: TargetSuggestions): void;
getBinderTarget(): ILEObject;
getRelative(fullPath: string): string;
private storeResolved;
loadProject(withRef?: string): Promise<void>;
resolvePathToObject(localPath: string, newText?: string): Promise<ILEObject>;
/**
* This can be expensive. It should only be called:
* before loadObjectsFromPaths and parseFile are called.
* @param filePath Fully qualified path to the file. Assumed to exist.
*/
handleRefsFile(filePath: string): Promise<void>;
isReferenceObject(ileObject: ILEObject, remove?: boolean): boolean;
removeObjectByPath(localPath: string): ILEObject[];
removeObject(resolvedObject: ILEObject): ILEObject[];
/**
* Resolves a search to an object. Use `systemName` parameter for short and long name.
*/
searchForObject(lookFor: ILEObject): ILEObject;
searchForAnyObject(lookFor: {
name: string;
types: ObjectType[];
}): ILEObject;
resolveLocalFile(name: string, baseFile?: string): string | undefined;
private getObjectType;
loadObjectsFromPaths(paths: string[]): Promise<ILEObject[]>;
parseFile(filePath: string): Promise<boolean>;
private createCmdTarget;
private createSrvPgmTarget;
/**
* Handles all DDS types: pf, lf, dspf
*/
private createDdsFileTarget;
private createClTarget;
private createSqlTargets;
private createRpgTarget;
getTarget(object: ILEObject): ILEObjectTarget | undefined;
getTargets(): ILEObjectTarget[];
resolveBinder(): void;
private convertBoundProgramToMultiModuleProgram;
createOrAppend(parentObject: ILEObject, newDep?: ILEObject): ILEObjectTarget;
private addNewTarget;
binderRequired(): boolean;
getTargetsOfType(type: ObjectType): ILEObjectTarget[];
getResolvedObjects(type?: ObjectType): ILEObject[];
getResolvedObject(fullPath: string): ILEObject;
/**
* This API is a little trick.
* You can pass in a valid file extension, or if you pass
* solely just `pgm`, it will return all programs that
* have multiple modules.
*/
getResolvedObjectsByFileExtension(ext: string): ILEObject[];
getExports(): {
[name: string]: ILEObject;
};
getImpactFor(theObject: ILEObject): ImpactedObject;
/**
* This is used when loading in all objects.
* SQL sources can have two object names: a system name and a long name
* Sadly the long name is not typically part of the path name, so we need to
* find the name inside of the source code.
*/
sqlObjectDataFromPath(fullPath: string): Promise<ObjectRef>;
}