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 7876x 7876x 7876x 7876x 26332x 26332x 978x 978x 25354x 25354x 7876x 7876x 7876x 1x 1x 1x 1x 7876x 7876x 381x 7876x 87x 7495x 3x 7408x 7405x 7405x 7405x 7876x 1x 1x 7876x 7876x 4x 4x 7876x 7876x 7876x 407x 407x 407x 7876x 210x 210x 210x 210x 210x 7259x 7259x 7259x 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}; } } |