UNPKG

@abaplint/core

Version:
483 lines • 22.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SyntaxLogic = void 0; const Statements = require("../2_statements/statements"); const Structures = require("../3_structures/structures"); const issue_1 = require("../../issue"); const nodes_1 = require("../nodes"); const _current_scope_1 = require("./_current_scope"); const _scope_type_1 = require("./_scope_type"); const _object_oriented_1 = require("./_object_oriented"); const _procedural_1 = require("./_procedural"); const objects_1 = require("../../objects"); const position_1 = require("../../position"); const data_1 = require("./structures/data"); const type_enum_1 = require("./structures/type_enum"); const types_1 = require("./structures/types"); const statics_1 = require("./structures/statics"); const constants_1 = require("./structures/constants"); const class_definition_1 = require("../types/class_definition"); const interface_definition_1 = require("../types/interface_definition"); const delete_memory_1 = require("./statements/delete_memory"); const perform_1 = require("./statements/perform"); const type_1 = require("./statements/type"); const constant_1 = require("./statements/constant"); const static_1 = require("./statements/static"); const search_1 = require("./statements/search"); const translate_1 = require("./statements/translate"); const modify_internal_1 = require("./statements/modify_internal"); const data_2 = require("./statements/data"); const parameter_1 = require("./statements/parameter"); const fieldsymbol_1 = require("./statements/fieldsymbol"); const tables_1 = require("./statements/tables"); const selectoption_1 = require("./statements/selectoption"); const interface_deferred_1 = require("./statements/interface_deferred"); const class_deferred_1 = require("./statements/class_deferred"); const call_1 = require("./statements/call"); const class_implementation_1 = require("./statements/class_implementation"); const method_implementation_1 = require("./statements/method_implementation"); const move_1 = require("./statements/move"); const move_corresponding_1 = require("./statements/move_corresponding"); const catch_1 = require("./statements/catch"); const loop_1 = require("./statements/loop"); const read_table_1 = require("./statements/read_table"); const select_1 = require("./statements/select"); const insert_internal_1 = require("./statements/insert_internal"); const split_1 = require("./statements/split"); const assign_1 = require("./statements/assign"); const convert_1 = require("./statements/convert"); const describe_1 = require("./statements/describe"); const read_textpool_1 = require("./statements/read_textpool"); const find_1 = require("./statements/find"); const message_1 = require("./statements/message"); const get_time_1 = require("./statements/get_time"); const get_parameter_1 = require("./statements/get_parameter"); const when_type_1 = require("./statements/when_type"); const if_1 = require("./statements/if"); const else_if_1 = require("./statements/else_if"); const append_1 = require("./statements/append"); const selection_screen_1 = require("./statements/selection_screen"); const ranges_1 = require("./statements/ranges"); const write_1 = require("./statements/write"); const case_1 = require("./statements/case"); const case_type_1 = require("./statements/case_type"); const create_object_1 = require("./statements/create_object"); const do_1 = require("./statements/do"); const concatenate_1 = require("./statements/concatenate"); const call_function_1 = require("./statements/call_function"); const clear_1 = require("./statements/clear"); const replace_1 = require("./statements/replace"); const get_bit_1 = require("./statements/get_bit"); const raise_1 = require("./statements/raise"); const delete_internal_1 = require("./statements/delete_internal"); const receive_1 = require("./statements/receive"); const when_1 = require("./statements/when"); const create_data_1 = require("./statements/create_data"); const call_transformation_1 = require("./statements/call_transformation"); const get_locale_1 = require("./statements/get_locale"); const set_locale_1 = require("./statements/set_locale"); const sort_1 = require("./statements/sort"); const read_report_1 = require("./statements/read_report"); const authority_check_1 = require("./statements/authority_check"); const insert_report_1 = require("./statements/insert_report"); const get_reference_1 = require("./statements/get_reference"); const insert_database_1 = require("./statements/insert_database"); const delete_database_1 = require("./statements/delete_database"); const import_dynpro_1 = require("./statements/import_dynpro"); const open_cursor_1 = require("./statements/open_cursor"); const fetch_next_cursor_1 = require("./statements/fetch_next_cursor"); const close_cursor_1 = require("./statements/close_cursor"); const syntax_check_1 = require("./statements/syntax_check"); const import_1 = require("./statements/import"); const export_1 = require("./statements/export"); const scan_1 = require("./statements/scan"); const submit_1 = require("./statements/submit"); const open_dataset_1 = require("./statements/open_dataset"); const close_dataset_1 = require("./statements/close_dataset"); const get_run_time_1 = require("./statements/get_run_time"); const update_database_1 = require("./statements/update_database"); const add_1 = require("./statements/add"); const editor_call_1 = require("./statements/editor_call"); const subtract_1 = require("./statements/subtract"); const add_corresponding_1 = require("./statements/add_corresponding"); const subtract_corresponding_1 = require("./statements/subtract_corresponding"); const multiply_1 = require("./statements/multiply"); const divide_1 = require("./statements/divide"); const condense_1 = require("./statements/condense"); const controls_1 = require("./statements/controls"); const while_1 = require("./statements/while"); const select_loop_1 = require("./statements/select_loop"); const check_1 = require("./statements/check"); const log_point_1 = require("./statements/log_point"); const severity_1 = require("../../severity"); const raise_event_1 = require("./statements/raise_event"); const form_1 = require("./statements/form"); const assert_1 = require("./statements/assert"); const set_parameter_1 = require("./statements/set_parameter"); const class_local_friends_1 = require("./statements/class_local_friends"); const get_badi_1 = require("./statements/get_badi"); const with_1 = require("./statements/with"); const with_loop_1 = require("./statements/with_loop"); const system_call_1 = require("./statements/system_call"); const collect_1 = require("./statements/collect"); const transfer_1 = require("./statements/transfer"); const modify_database_1 = require("./statements/modify_database"); const truncate_dataset_1 = require("./statements/truncate_dataset"); const call_badi_1 = require("./statements/call_badi"); const call_kernel_1 = require("./statements/call_kernel"); const pack_1 = require("./statements/pack"); const unpack_1 = require("./statements/unpack"); const format_1 = require("./statements/format"); const set_pf_status_1 = require("./statements/set_pf_status"); const set_titlebar_1 = require("./statements/set_titlebar"); const call_transaction_1 = require("./statements/call_transaction"); const set_handler_1 = require("./statements/set_handler"); const wait_1 = require("./statements/wait"); const delete_report_1 = require("./statements/delete_report"); const shift_1 = require("./statements/shift"); const set_bit_1 = require("./statements/set_bit"); const modify_screen_1 = require("./statements/modify_screen"); const delete_cluster_1 = require("./statements/delete_cluster"); const unassign_1 = require("./statements/unassign"); const insert_textpool_1 = require("./statements/insert_textpool"); const get_cursor_1 = require("./statements/get_cursor"); const loop_at_screen_1 = require("./statements/loop_at_screen"); const insert_field_group_1 = require("./statements/insert_field_group"); const read_entities_1 = require("./statements/read_entities"); const modify_entities_1 = require("./statements/modify_entities"); const commit_entities_1 = require("./statements/commit_entities"); const _syntax_input_1 = require("./_syntax_input"); const assert_error_1 = require("./assert_error"); // ----------------------------------- const map = {}; function addToMap(handler) { if (map[handler.constructor.name] !== undefined) { throw new assert_error_1.AssertError("syntax.ts duplicate statement syntax handler"); } map[handler.constructor.name] = handler; } if (Object.keys(map).length === 0) { addToMap(new interface_deferred_1.InterfaceDeferred()); addToMap(new perform_1.Perform()); addToMap(new class_deferred_1.ClassDeferred()); addToMap(new call_1.Call()); addToMap(new set_handler_1.SetHandler()); addToMap(new class_implementation_1.ClassImplementation()); addToMap(new method_implementation_1.MethodImplementation()); addToMap(new move_1.Move()); addToMap(new get_badi_1.GetBadi()); addToMap(new call_badi_1.CallBadi()); addToMap(new get_cursor_1.GetCursor()); addToMap(new replace_1.Replace()); addToMap(new truncate_dataset_1.TruncateDataset()); addToMap(new assert_1.Assert()); addToMap(new catch_1.Catch()); addToMap(new loop_1.Loop()); addToMap(new loop_at_screen_1.LoopAtScreen()); addToMap(new set_pf_status_1.SetPFStatus()); addToMap(new set_titlebar_1.SetTitlebar()); addToMap(new submit_1.Submit()); addToMap(new insert_textpool_1.InsertTextpool()); addToMap(new read_table_1.ReadTable()); addToMap(new syntax_check_1.SyntaxCheck()); addToMap(new delete_report_1.DeleteReport()); addToMap(new import_1.Import()); addToMap(new collect_1.Collect()); addToMap(new export_1.Export()); addToMap(new scan_1.Scan()); addToMap(new transfer_1.Transfer()); addToMap(new split_1.Split()); addToMap(new call_function_1.CallFunction()); addToMap(new delete_internal_1.DeleteInternal()); addToMap(new delete_cluster_1.DeleteCluster()); addToMap(new clear_1.Clear()); addToMap(new receive_1.Receive()); addToMap(new get_bit_1.GetBit()); addToMap(new class_local_friends_1.ClassLocalFriends()); addToMap(new select_1.Select()); addToMap(new modify_screen_1.ModifyScreen()); addToMap(new insert_internal_1.InsertInternal()); addToMap(new pack_1.Pack()); addToMap(new unpack_1.Unpack()); addToMap(new assign_1.Assign()); addToMap(new set_locale_1.SetLocale()); addToMap(new set_parameter_1.SetParameter()); addToMap(new convert_1.Convert()); addToMap(new controls_1.Controls()); addToMap(new when_1.When()); addToMap(new insert_database_1.InsertDatabase()); addToMap(new delete_database_1.DeleteDatabase()); addToMap(new update_database_1.UpdateDatabase()); addToMap(new sort_1.Sort()); addToMap(new wait_1.Wait()); addToMap(new condense_1.Condense()); addToMap(new set_bit_1.SetBit()); addToMap(new open_dataset_1.OpenDataset()); addToMap(new close_dataset_1.CloseDataset()); addToMap(new read_report_1.ReadReport()); addToMap(new do_1.Do()); addToMap(new describe_1.Describe()); addToMap(new find_1.Find()); addToMap(new message_1.Message()); addToMap(new system_call_1.SystemCall()); addToMap(new insert_field_group_1.InsertFieldGroup()); addToMap(new get_time_1.GetTime()); addToMap(new unassign_1.Unassign()); addToMap(new case_type_1.CaseType()); addToMap(new get_parameter_1.GetParameter()); addToMap(new format_1.Format()); addToMap(new when_type_1.WhenType()); addToMap(new if_1.If()); addToMap(new log_point_1.LogPoint()); addToMap(new while_1.While()); addToMap(new with_1.With()); addToMap(new with_loop_1.WithLoop()); addToMap(new call_transformation_1.CallTransformation()); addToMap(new call_transaction_1.CallTransaction()); addToMap(new get_locale_1.GetLocale()); addToMap(new get_reference_1.GetReference()); addToMap(new else_if_1.ElseIf()); addToMap(new get_run_time_1.GetRunTime()); addToMap(new create_object_1.CreateObject()); addToMap(new import_dynpro_1.ImportDynpro()); addToMap(new create_data_1.CreateData()); addToMap(new case_1.Case()); addToMap(new shift_1.Shift()); addToMap(new raise_1.Raise()); addToMap(new concatenate_1.Concatenate()); addToMap(new append_1.Append()); addToMap(new select_loop_1.SelectLoop()); addToMap(new write_1.Write()); addToMap(new move_corresponding_1.MoveCorresponding()); addToMap(new authority_check_1.AuthorityCheck()); addToMap(new insert_report_1.InsertReport()); addToMap(new selection_screen_1.SelectionScreen()); addToMap(new ranges_1.Ranges()); addToMap(new add_1.Add()); addToMap(new raise_event_1.RaiseEvent()); addToMap(new subtract_1.Subtract()); addToMap(new add_corresponding_1.AddCorresponding()); addToMap(new subtract_corresponding_1.SubtractCorresponding()); addToMap(new multiply_1.Multiply()); addToMap(new divide_1.Divide()); addToMap(new check_1.Check()); addToMap(new modify_database_1.ModifyDatabase()); addToMap(new form_1.Form()); addToMap(new selectoption_1.SelectOption()); addToMap(new tables_1.Tables()); addToMap(new parameter_1.Parameter()); addToMap(new fieldsymbol_1.FieldSymbol()); addToMap(new read_entities_1.ReadEntities()); addToMap(new modify_entities_1.ModifyEntities()); addToMap(new commit_entities_1.CommitEntities()); addToMap(new call_kernel_1.CallKernel()); addToMap(new open_cursor_1.OpenCursor()); addToMap(new fetch_next_cursor_1.FetchNextCursor()); addToMap(new close_cursor_1.CloseCursor()); addToMap(new search_1.Search()); addToMap(new translate_1.Translate()); addToMap(new modify_internal_1.ModifyInternal()); addToMap(new read_textpool_1.ReadTextpool()); addToMap(new editor_call_1.EditorCall()); addToMap(new delete_memory_1.DeleteMemory()); } // ----------------------------------- class SyntaxLogic { constructor(reg, object) { this.reg = reg; this.issues = []; this.object = object; this.scope = _current_scope_1.CurrentScope.buildDefault(this.reg, object); this.helpers = { oooc: new _object_oriented_1.ObjectOriented(this.scope), proc: new _procedural_1.Procedural(this.reg, this.scope), }; } run() { if (this.object.syntaxResult !== undefined) { return this.object.syntaxResult; } this.issues = []; this.reg.getDDICReferences().clear(this.object); this.reg.getMSAGReferences().clear(this.object); if (this.object instanceof objects_1.Program && this.object.isInclude()) { // todo, show some kind of error? return { issues: [], spaghetti: this.scope.pop(new position_1.Position(Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER)) }; } this.traverseObject(); for (;;) { const spaghetti = this.scope.pop(new position_1.Position(Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER)); // pop built-in scopes if (spaghetti.getTop().getIdentifier().stype === _scope_type_1.ScopeType.BuiltIn) { const result = { issues: this.issues, spaghetti }; this.object.syntaxResult = result; return result; } } } ///////////////////////////// traverseObject() { const traversal = this.object.getSequencedFiles(); if (this.object instanceof objects_1.Program || this.object instanceof objects_1.FunctionGroup) { for (const f of this.object.getSequencedFiles()) { // add FORM defintions to the _global object scope this.helpers.proc.addAllFormDefinitions(f, this.object); } const main = this.object.getMainABAPFile(); if (main !== undefined) { let stype = _scope_type_1.ScopeType.Program; if (this.object instanceof objects_1.FunctionGroup) { stype = _scope_type_1.ScopeType.FunctionGroup; } this.scope.push(stype, this.object.getName(), new position_1.Position(1, 1), main.getFilename()); } } else if (this.object instanceof objects_1.TypePool) { const main = this.object.getMainABAPFile(); if (main !== undefined) { this.scope.push(_scope_type_1.ScopeType.TypePool, this.object.getName(), new position_1.Position(1, 1), main.getFilename()); } } for (const file of traversal) { this.currentFile = file; const structure = this.currentFile.getStructure(); if (structure === undefined) { return this.scope; } else { this.traverse(structure); } } return this.scope; } newIssue(token, message) { const issue = issue_1.Issue.atToken(this.currentFile, token, message, _syntax_input_1.CheckSyntaxKey, severity_1.Severity.Error); this.issues.push(issue); } traverse(node) { for (const child of node.getChildren()) { const isStructure = child instanceof nodes_1.StructureNode; const isStatement = child instanceof nodes_1.StatementNode; try { if (isStructure) { const gotoNext = this.updateScopeStructure(child); if (gotoNext === true) { continue; } } else if (isStatement) { this.updateScopeStatement(child); } } catch (e) { this.newIssue(child.getFirstToken(), e.message); break; } // walk into INCLUDEs if (isStatement && child.get() instanceof Statements.Include) { const file = this.helpers.proc.findInclude(child, this.object); if (file !== undefined && file.getStructure() !== undefined) { const old = this.currentFile; this.currentFile = file; this.traverse(file.getStructure()); this.currentFile = old; } } if (isStructure || isStatement) { this.traverse(child); } } } /** * if this returns true, then the traversal should continue with next child */ updateScopeStructure(node) { const filename = this.currentFile.getFilename(); const stru = node.get(); const input = { scope: this.scope, filename, issues: this.issues, }; if (stru instanceof Structures.ClassDefinition) { new class_definition_1.ClassDefinition(node, input); return true; } else if (stru instanceof Structures.Interface) { new interface_definition_1.InterfaceDefinition(node, input); return true; } else if (stru instanceof Structures.Types) { this.scope.addType(new types_1.Types().runSyntax(node, input)); return true; } else if (stru instanceof Structures.Constants) { this.scope.addIdentifier(new constants_1.Constants().runSyntax(node, input).type); return true; } else if (stru instanceof Structures.Data) { this.scope.addIdentifier(data_1.Data.runSyntax(node, input)); return true; } else if (stru instanceof Structures.Statics) { this.scope.addIdentifier(new statics_1.Statics().runSyntax(node, input)); return true; } else if (stru instanceof Structures.TypeEnum) { const values = new type_enum_1.TypeEnum().runSyntax(node, input).values; this.scope.addList(values); return true; } return false; } updateScopeStatement(node) { const filename = this.currentFile.getFilename(); const s = node.get(); const input = { scope: this.scope, filename, issues: this.issues, }; // todo, refactor if (s instanceof Statements.Type) { this.scope.addType(new type_1.Type().runSyntax(node, input)); return; } else if (s instanceof Statements.Constant) { this.scope.addIdentifier(new constant_1.Constant().runSyntax(node, input)); return; } else if (s instanceof Statements.Static) { this.scope.addIdentifier(new static_1.Static().runSyntax(node, input)); return; } else if (s instanceof Statements.Data) { this.scope.addIdentifier(new data_2.Data().runSyntax(node, input)); return; } const name = s.constructor.name; if (map[name]) { map[name].runSyntax(node, input); return; } if (s instanceof Statements.FunctionModule) { this.helpers.proc.findFunctionScope(this.object, node, filename); } else if (s instanceof Statements.EndForm || s instanceof Statements.EndFunction || s instanceof Statements.EndClass || s instanceof Statements.EndInterface) { this.scope.pop(node.getLastToken().getEnd()); } else if (s instanceof Statements.EndMethod) { if (this.scope.getType() === _scope_type_1.ScopeType.Method) { this.scope.pop(node.getLastToken().getEnd()); } if (this.scope.getType() === _scope_type_1.ScopeType.MethodInstance) { this.scope.pop(node.getLastToken().getEnd()); } } } } exports.SyntaxLogic = SyntaxLogic; //# sourceMappingURL=syntax.js.map