Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 8353x 8353x 8353x 8353x 28206x 28206x 1005x 1005x 27201x 27201x 8353x 8353x 8353x 1x 1x 1x 1x 8353x 8353x 413x 8353x 90x 7940x 4x 7850x 7846x 7846x 7846x 8353x 1x 1x 8353x 8353x 4x 4x 8353x 8353x 8353x 419x 419x 419x 8353x 227x 227x 227x 227x 227x 7707x 7707x 7707x 1x 1x | import {Unknown, Empty, Comment as StatementComment} from "../2_statements/statements/_statement";
import {IStructure} from "./structures/_structure";
import * as Structures from "./structures";
import {Issue} from "../../issue";
import {StructureNode, StatementNode} from "../nodes";
import {Position} from "../../position";
import {IStructureResult} from "./structure_result";
import {IStatementResult} from "../2_statements/statement_result";
import {IFile} from "../../files/_ifile";
import {Severity} from "../../severity";
import {IStructureRunnable} from "./structures/_structure_runnable";
export class StructureParser {
private static readonly singletons: {[index: string]: IStructureRunnable} = {};
public static run(input: IStatementResult): IStructureResult {
const structure = this.findStructureForFile(input.file.getFilename());
const filtered: StatementNode[] = [];
for (const s of input.statements) {
const get = s.get();
if (get instanceof StatementComment || get instanceof Empty || get instanceof Unknown) {
continue;
}
filtered.push(s);
}
return this.runFile(structure, input.file, filtered);
}
//////////////////
private static findStructureForFile(filename: string): IStructure {
// todo, not sure this is the right place for this logic
if (filename.endsWith(".clas.abap")) {
return new Structures.ClassGlobal();
} else if (filename.endsWith(".intf.abap")) {
return new Structures.InterfaceGlobal();
} else if (filename.match(/\.screen\_\d+\.abap$/i)) {
return new Structures.DynproLogic();
} else {
// todo, add a special structure for TYPE-POOLS
return new Structures.Any();
}
}
private static runFile(structure: IStructure, file: IFile, statements: StatementNode[]): {issues: Issue[], node?: StructureNode} {
const parent = new StructureNode(structure);
if (this.singletons[structure.constructor.name] === undefined) {
this.singletons[structure.constructor.name] = structure.getMatcher();
}
const result = this.singletons[structure.constructor.name].run(statements, parent);
if (result.error) {
const issue = Issue.atPosition(file, new Position(1, 1), result.errorDescription, "structure", Severity.Error);
return {issues: [issue], node: undefined};
}
if (result.unmatched.length > 0) {
const statement = result.unmatched[0];
const descr = "Unexpected " + statement.get().constructor.name.toUpperCase();
const issue = Issue.atPosition(file, statement.getStart(), descr, "structure", Severity.Error);
return {issues: [issue], node: undefined};
}
return {issues: [], node: parent};
}
} |