@abaplint/core
Version:
abaplint - Core API
483 lines • 22.2 kB
JavaScript
"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