@abaplint/transpiler-cli 2.6.43 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/build/bundle.js +474 -177
  2. package/package.json +7 -6
package/build/bundle.js CHANGED
@@ -7847,6 +7847,7 @@ class StatementParser {
7847
7847
  const concat = statement.concatTokens().toUpperCase();
7848
7848
  if (concat.startsWith("CALL METHOD ") === false
7849
7849
  && concat.startsWith("RAISE EXCEPTION TYPE ") === false
7850
+ && concat.startsWith("READ TABLE ") === false
7850
7851
  && concat.startsWith("LOOP AT ") === false
7851
7852
  && concat.startsWith("CALL FUNCTION ") === false) {
7852
7853
  for (const { first, second } of this.buildSplits(statement.getTokens())) {
@@ -18622,7 +18623,7 @@ BuiltIn.methods = [
18622
18623
  {
18623
18624
  name: "BOOLC",
18624
18625
  mandatory: {
18625
- "val": new basic_1.StringType(),
18626
+ "val": new basic_1.CLikeType(),
18626
18627
  },
18627
18628
  return: new basic_1.StringType(),
18628
18629
  version: version_1.Version.v702,
@@ -18630,7 +18631,7 @@ BuiltIn.methods = [
18630
18631
  {
18631
18632
  name: "BOOLX",
18632
18633
  mandatory: {
18633
- "bool": new basic_1.StringType(),
18634
+ "bool": new basic_1.CLikeType(),
18634
18635
  },
18635
18636
  optional: {
18636
18637
  "bit": new basic_1.IntegerType(),
@@ -18648,7 +18649,7 @@ BuiltIn.methods = [
18648
18649
  {
18649
18650
  name: "CHAR_OFF",
18650
18651
  mandatory: {
18651
- "val": new basic_1.StringType(),
18652
+ "val": new basic_1.CLikeType(),
18652
18653
  "add": new basic_1.IntegerType(),
18653
18654
  },
18654
18655
  optional: {
@@ -18660,23 +18661,23 @@ BuiltIn.methods = [
18660
18661
  {
18661
18662
  name: "CHARLEN",
18662
18663
  mandatory: {
18663
- "val": new basic_1.StringType(),
18664
+ "val": new basic_1.CLikeType(),
18664
18665
  },
18665
18666
  return: new basic_1.IntegerType(),
18666
18667
  },
18667
18668
  {
18668
18669
  name: "CMAX",
18669
18670
  mandatory: {
18670
- "val1": new basic_1.StringType(),
18671
- "val2": new basic_1.StringType(),
18671
+ "val1": new basic_1.CLikeType(),
18672
+ "val2": new basic_1.CLikeType(),
18672
18673
  },
18673
18674
  optional: {
18674
- "val3": new basic_1.StringType(),
18675
- "val4": new basic_1.StringType(),
18676
- "val5": new basic_1.StringType(),
18677
- "val6": new basic_1.StringType(),
18678
- "val7": new basic_1.StringType(),
18679
- "val9": new basic_1.StringType(),
18675
+ "val3": new basic_1.CLikeType(),
18676
+ "val4": new basic_1.CLikeType(),
18677
+ "val5": new basic_1.CLikeType(),
18678
+ "val6": new basic_1.CLikeType(),
18679
+ "val7": new basic_1.CLikeType(),
18680
+ "val9": new basic_1.CLikeType(),
18680
18681
  },
18681
18682
  return: new basic_1.StringType(),
18682
18683
  version: version_1.Version.v702,
@@ -18684,16 +18685,16 @@ BuiltIn.methods = [
18684
18685
  {
18685
18686
  name: "CMIN",
18686
18687
  mandatory: {
18687
- "val1": new basic_1.StringType(),
18688
- "val2": new basic_1.StringType(),
18688
+ "val1": new basic_1.CLikeType(),
18689
+ "val2": new basic_1.CLikeType(),
18689
18690
  },
18690
18691
  optional: {
18691
- "val3": new basic_1.StringType(),
18692
- "val4": new basic_1.StringType(),
18693
- "val5": new basic_1.StringType(),
18694
- "val6": new basic_1.StringType(),
18695
- "val7": new basic_1.StringType(),
18696
- "val9": new basic_1.StringType(),
18692
+ "val3": new basic_1.CLikeType(),
18693
+ "val4": new basic_1.CLikeType(),
18694
+ "val5": new basic_1.CLikeType(),
18695
+ "val6": new basic_1.CLikeType(),
18696
+ "val7": new basic_1.CLikeType(),
18697
+ "val9": new basic_1.CLikeType(),
18697
18698
  },
18698
18699
  return: new basic_1.StringType(),
18699
18700
  version: version_1.Version.v702,
@@ -18704,7 +18705,7 @@ BuiltIn.methods = [
18704
18705
  "table": new basic_1.TableType(new basic_1.AnyType(), { withHeader: false, keyType: basic_1.TableKeyType.default }),
18705
18706
  },
18706
18707
  optional: {
18707
- "sep": new basic_1.StringType(),
18708
+ "sep": new basic_1.CLikeType(),
18708
18709
  },
18709
18710
  return: new basic_1.StringType(),
18710
18711
  version: version_1.Version.v702,
@@ -18712,12 +18713,12 @@ BuiltIn.methods = [
18712
18713
  {
18713
18714
  name: "CONDENSE",
18714
18715
  mandatory: {
18715
- "val": new basic_1.StringType(),
18716
+ "val": new basic_1.CLikeType(),
18716
18717
  },
18717
18718
  optional: {
18718
- "del": new basic_1.StringType(),
18719
- "from": new basic_1.StringType(),
18720
- "to": new basic_1.StringType(),
18719
+ "del": new basic_1.CLikeType(),
18720
+ "from": new basic_1.CLikeType(),
18721
+ "to": new basic_1.CLikeType(),
18721
18722
  },
18722
18723
  return: new basic_1.StringType(),
18723
18724
  version: version_1.Version.v702,
@@ -18725,14 +18726,14 @@ BuiltIn.methods = [
18725
18726
  {
18726
18727
  name: "CONTAINS",
18727
18728
  mandatory: {
18728
- "val": new basic_1.StringType(),
18729
+ "val": new basic_1.CLikeType(),
18729
18730
  },
18730
18731
  optional: {
18731
- "sub": new basic_1.StringType(),
18732
- "start": new basic_1.StringType(),
18733
- "end": new basic_1.StringType(),
18734
- "regex": new basic_1.StringType(),
18735
- "pcre": new basic_1.StringType(),
18732
+ "sub": new basic_1.CLikeType(),
18733
+ "start": new basic_1.CLikeType(),
18734
+ "end": new basic_1.CLikeType(),
18735
+ "regex": new basic_1.CLikeType(),
18736
+ "pcre": new basic_1.CLikeType(),
18736
18737
  "case": new basic_1.CharacterType(1),
18737
18738
  "off": new basic_1.IntegerType(),
18738
18739
  "len": new basic_1.IntegerType(),
@@ -18745,12 +18746,12 @@ BuiltIn.methods = [
18745
18746
  {
18746
18747
  name: "CONTAINS_ANY_NOT_OF",
18747
18748
  mandatory: {
18748
- "val": new basic_1.StringType(),
18749
+ "val": new basic_1.CLikeType(),
18749
18750
  },
18750
18751
  optional: {
18751
- "sub": new basic_1.StringType(),
18752
- "start": new basic_1.StringType(),
18753
- "end": new basic_1.StringType(),
18752
+ "sub": new basic_1.CLikeType(),
18753
+ "start": new basic_1.CLikeType(),
18754
+ "end": new basic_1.CLikeType(),
18754
18755
  "off": new basic_1.IntegerType(),
18755
18756
  "len": new basic_1.IntegerType(),
18756
18757
  "occ": new basic_1.IntegerType(),
@@ -18761,12 +18762,12 @@ BuiltIn.methods = [
18761
18762
  {
18762
18763
  name: "CONTAINS_ANY_OF",
18763
18764
  mandatory: {
18764
- "val": new basic_1.StringType(),
18765
+ "val": new basic_1.CLikeType(),
18765
18766
  },
18766
18767
  optional: {
18767
- "sub": new basic_1.StringType(),
18768
- "start": new basic_1.StringType(),
18769
- "end": new basic_1.StringType(),
18768
+ "sub": new basic_1.CLikeType(),
18769
+ "start": new basic_1.CLikeType(),
18770
+ "end": new basic_1.CLikeType(),
18770
18771
  "off": new basic_1.IntegerType(),
18771
18772
  "len": new basic_1.IntegerType(),
18772
18773
  "occ": new basic_1.IntegerType(),
@@ -18792,12 +18793,12 @@ BuiltIn.methods = [
18792
18793
  {
18793
18794
  name: "COUNT",
18794
18795
  mandatory: {
18795
- "val": new basic_1.StringType(),
18796
+ "val": new basic_1.CLikeType(),
18796
18797
  },
18797
18798
  optional: {
18798
- "sub": new basic_1.StringType(),
18799
- "regex": new basic_1.StringType(),
18800
- "pcre": new basic_1.StringType(),
18799
+ "sub": new basic_1.CLikeType(),
18800
+ "regex": new basic_1.CLikeType(),
18801
+ "pcre": new basic_1.CLikeType(),
18801
18802
  "case": new basic_1.CharacterType(1),
18802
18803
  "off": new basic_1.IntegerType(),
18803
18804
  "len": new basic_1.IntegerType(),
@@ -18808,12 +18809,12 @@ BuiltIn.methods = [
18808
18809
  {
18809
18810
  name: "COUNT_ANY_NOT_OF",
18810
18811
  mandatory: {
18811
- "val": new basic_1.StringType(),
18812
+ "val": new basic_1.CLikeType(),
18812
18813
  },
18813
18814
  optional: {
18814
- "sub": new basic_1.StringType(),
18815
- "regex": new basic_1.StringType(),
18816
- "pcre": new basic_1.StringType(),
18815
+ "sub": new basic_1.CLikeType(),
18816
+ "regex": new basic_1.CLikeType(),
18817
+ "pcre": new basic_1.CLikeType(),
18817
18818
  "case": new basic_1.CharacterType(1),
18818
18819
  "off": new basic_1.IntegerType(),
18819
18820
  "len": new basic_1.IntegerType(),
@@ -18824,12 +18825,12 @@ BuiltIn.methods = [
18824
18825
  {
18825
18826
  name: "COUNT_ANY_OF",
18826
18827
  mandatory: {
18827
- "val": new basic_1.StringType(),
18828
+ "val": new basic_1.CLikeType(),
18828
18829
  },
18829
18830
  optional: {
18830
- "sub": new basic_1.StringType(),
18831
- "regex": new basic_1.StringType(),
18832
- "pcre": new basic_1.StringType(),
18831
+ "sub": new basic_1.CLikeType(),
18832
+ "regex": new basic_1.CLikeType(),
18833
+ "pcre": new basic_1.CLikeType(),
18833
18834
  "case": new basic_1.CharacterType(1),
18834
18835
  "off": new basic_1.IntegerType(),
18835
18836
  "len": new basic_1.IntegerType(),
@@ -18840,15 +18841,15 @@ BuiltIn.methods = [
18840
18841
  {
18841
18842
  name: "DBMAXLEN",
18842
18843
  mandatory: {
18843
- "val": new basic_1.StringType(),
18844
+ "val": new basic_1.CLikeType(),
18844
18845
  },
18845
18846
  return: new basic_1.IntegerType(),
18846
18847
  },
18847
18848
  {
18848
18849
  name: "DISTANCE",
18849
18850
  mandatory: {
18850
- "val1": new basic_1.StringType(),
18851
- "val2": new basic_1.StringType(),
18851
+ "val1": new basic_1.CLikeType(),
18852
+ "val2": new basic_1.CLikeType(),
18852
18853
  },
18853
18854
  return: new basic_1.IntegerType(),
18854
18855
  version: version_1.Version.v702,
@@ -18856,8 +18857,8 @@ BuiltIn.methods = [
18856
18857
  {
18857
18858
  name: "ESCAPE",
18858
18859
  mandatory: {
18859
- "val": new basic_1.StringType(),
18860
- "format": new basic_1.StringType(),
18860
+ "val": new basic_1.CLikeType(),
18861
+ "format": new basic_1.CLikeType(),
18861
18862
  },
18862
18863
  return: new basic_1.StringType(),
18863
18864
  version: version_1.Version.v702,
@@ -18872,12 +18873,12 @@ BuiltIn.methods = [
18872
18873
  {
18873
18874
  name: "FIND",
18874
18875
  mandatory: {
18875
- "val": new basic_1.StringType(),
18876
+ "val": new basic_1.CLikeType(),
18876
18877
  },
18877
18878
  optional: {
18878
- "sub": new basic_1.StringType(),
18879
- "regex": new basic_1.StringType(),
18880
- "pcre": new basic_1.StringType(),
18879
+ "sub": new basic_1.CLikeType(),
18880
+ "regex": new basic_1.CLikeType(),
18881
+ "pcre": new basic_1.CLikeType(),
18881
18882
  "case": new basic_1.CharacterType(1),
18882
18883
  "off": new basic_1.IntegerType(),
18883
18884
  "len": new basic_1.IntegerType(),
@@ -18889,10 +18890,10 @@ BuiltIn.methods = [
18889
18890
  {
18890
18891
  name: "FIND_ANY_NOT_OF",
18891
18892
  mandatory: {
18892
- "val": new basic_1.StringType(),
18893
+ "val": new basic_1.CLikeType(),
18893
18894
  },
18894
18895
  optional: {
18895
- "sub": new basic_1.StringType(),
18896
+ "sub": new basic_1.CLikeType(),
18896
18897
  "off": new basic_1.IntegerType(),
18897
18898
  "len": new basic_1.IntegerType(),
18898
18899
  "occ": new basic_1.IntegerType(),
@@ -18903,10 +18904,10 @@ BuiltIn.methods = [
18903
18904
  {
18904
18905
  name: "FIND_ANY_OF",
18905
18906
  mandatory: {
18906
- "val": new basic_1.StringType(),
18907
+ "val": new basic_1.CLikeType(),
18907
18908
  },
18908
18909
  optional: {
18909
- "sub": new basic_1.StringType(),
18910
+ "sub": new basic_1.CLikeType(),
18910
18911
  "off": new basic_1.IntegerType(),
18911
18912
  "len": new basic_1.IntegerType(),
18912
18913
  "occ": new basic_1.IntegerType(),
@@ -18917,12 +18918,12 @@ BuiltIn.methods = [
18917
18918
  {
18918
18919
  name: "FIND_END",
18919
18920
  mandatory: {
18920
- "val": new basic_1.StringType(),
18921
+ "val": new basic_1.CLikeType(),
18921
18922
  },
18922
18923
  optional: {
18923
- "sub": new basic_1.StringType(),
18924
- "regex": new basic_1.StringType(),
18925
- "pcre": new basic_1.StringType(),
18924
+ "sub": new basic_1.CLikeType(),
18925
+ "regex": new basic_1.CLikeType(),
18926
+ "pcre": new basic_1.CLikeType(),
18926
18927
  "case": new basic_1.CharacterType(1),
18927
18928
  "off": new basic_1.IntegerType(),
18928
18929
  "len": new basic_1.IntegerType(),
@@ -18947,7 +18948,9 @@ BuiltIn.methods = [
18947
18948
  },
18948
18949
  {
18949
18950
  name: "FROM_MIXED",
18950
- mandatory: { "val": new basic_1.StringType() },
18951
+ mandatory: {
18952
+ "val": new basic_1.CLikeType()
18953
+ },
18951
18954
  optional: {
18952
18955
  "case": new basic_1.CharacterType(1),
18953
18956
  "sep": new basic_1.IntegerType(),
@@ -18959,8 +18962,8 @@ BuiltIn.methods = [
18959
18962
  {
18960
18963
  name: "INSERT",
18961
18964
  mandatory: {
18962
- "val": new basic_1.StringType(),
18963
- "sub": new basic_1.StringType(),
18965
+ "val": new basic_1.CLikeType(),
18966
+ "sub": new basic_1.CLikeType(),
18964
18967
  },
18965
18968
  optional: {
18966
18969
  "off": new basic_1.IntegerType(),
@@ -18989,7 +18992,7 @@ BuiltIn.methods = [
18989
18992
  {
18990
18993
  name: "LINE_INDEX",
18991
18994
  mandatory: {
18992
- "val": new basic_1.StringType(),
18995
+ "val": new basic_1.CLikeType(),
18993
18996
  },
18994
18997
  return: new basic_1.IntegerType(),
18995
18998
  version: version_1.Version.v740sp02,
@@ -19018,11 +19021,11 @@ BuiltIn.methods = [
19018
19021
  {
19019
19022
  name: "MATCH",
19020
19023
  mandatory: {
19021
- "val": new basic_1.StringType(),
19024
+ "val": new basic_1.CLikeType(),
19022
19025
  }, optional: {
19023
19026
  "case": new basic_1.CharacterType(1),
19024
- "regex": new basic_1.StringType(),
19025
- "pcre": new basic_1.StringType(),
19027
+ "regex": new basic_1.CLikeType(),
19028
+ "pcre": new basic_1.CLikeType(),
19026
19029
  "occ": new basic_1.IntegerType(),
19027
19030
  },
19028
19031
  return: new basic_1.StringType(),
@@ -19031,12 +19034,12 @@ BuiltIn.methods = [
19031
19034
  {
19032
19035
  name: "MATCHES",
19033
19036
  mandatory: {
19034
- "val": new basic_1.StringType(),
19037
+ "val": new basic_1.CLikeType(),
19035
19038
  },
19036
19039
  optional: {
19037
19040
  "case": new basic_1.CharacterType(1),
19038
- "regex": new basic_1.StringType(),
19039
- "pcre": new basic_1.StringType(),
19041
+ "regex": new basic_1.CLikeType(),
19042
+ "pcre": new basic_1.CLikeType(),
19040
19043
  "off": new basic_1.IntegerType(),
19041
19044
  "len": new basic_1.IntegerType(),
19042
19045
  },
@@ -19047,17 +19050,17 @@ BuiltIn.methods = [
19047
19050
  {
19048
19051
  name: "NMAX",
19049
19052
  mandatory: {
19050
- "val1": new basic_1.StringType(),
19051
- "val2": new basic_1.StringType(),
19053
+ "val1": new basic_1.CLikeType(),
19054
+ "val2": new basic_1.CLikeType(),
19052
19055
  },
19053
19056
  optional: {
19054
- "val3": new basic_1.StringType(),
19055
- "val4": new basic_1.StringType(),
19056
- "val5": new basic_1.StringType(),
19057
- "val6": new basic_1.StringType(),
19058
- "val7": new basic_1.StringType(),
19059
- "val8": new basic_1.StringType(),
19060
- "val9": new basic_1.StringType(),
19057
+ "val3": new basic_1.CLikeType(),
19058
+ "val4": new basic_1.CLikeType(),
19059
+ "val5": new basic_1.CLikeType(),
19060
+ "val6": new basic_1.CLikeType(),
19061
+ "val7": new basic_1.CLikeType(),
19062
+ "val8": new basic_1.CLikeType(),
19063
+ "val9": new basic_1.CLikeType(),
19061
19064
  },
19062
19065
  return: new basic_1.IntegerType(),
19063
19066
  version: version_1.Version.v702,
@@ -19065,17 +19068,17 @@ BuiltIn.methods = [
19065
19068
  {
19066
19069
  name: "NMIN",
19067
19070
  mandatory: {
19068
- "val1": new basic_1.StringType(),
19069
- "val2": new basic_1.StringType(),
19071
+ "val1": new basic_1.CLikeType(),
19072
+ "val2": new basic_1.CLikeType(),
19070
19073
  },
19071
19074
  optional: {
19072
- "val3": new basic_1.StringType(),
19073
- "val4": new basic_1.StringType(),
19074
- "val5": new basic_1.StringType(),
19075
- "val6": new basic_1.StringType(),
19076
- "val7": new basic_1.StringType(),
19077
- "val8": new basic_1.StringType(),
19078
- "val9": new basic_1.StringType(),
19075
+ "val3": new basic_1.CLikeType(),
19076
+ "val4": new basic_1.CLikeType(),
19077
+ "val5": new basic_1.CLikeType(),
19078
+ "val6": new basic_1.CLikeType(),
19079
+ "val7": new basic_1.CLikeType(),
19080
+ "val8": new basic_1.CLikeType(),
19081
+ "val9": new basic_1.CLikeType(),
19079
19082
  },
19080
19083
  return: new basic_1.IntegerType(),
19081
19084
  version: version_1.Version.v702,
@@ -19083,14 +19086,14 @@ BuiltIn.methods = [
19083
19086
  {
19084
19087
  name: "NUMOFCHAR",
19085
19088
  mandatory: {
19086
- "val": new basic_1.StringType(),
19089
+ "val": new basic_1.CLikeType(),
19087
19090
  },
19088
19091
  return: new basic_1.IntegerType(),
19089
19092
  },
19090
19093
  {
19091
19094
  name: "REPEAT",
19092
19095
  mandatory: {
19093
- "val": new basic_1.StringType(),
19096
+ "val": new basic_1.CLikeType(),
19094
19097
  "occ": new basic_1.IntegerType(),
19095
19098
  },
19096
19099
  return: new basic_1.StringType(),
@@ -19099,13 +19102,13 @@ BuiltIn.methods = [
19099
19102
  {
19100
19103
  name: "REPLACE",
19101
19104
  mandatory: {
19102
- "val": new basic_1.StringType(),
19103
- "with": new basic_1.StringType(),
19105
+ "val": new basic_1.CLikeType(),
19106
+ "with": new basic_1.CLikeType(),
19104
19107
  },
19105
19108
  optional: {
19106
- "sub": new basic_1.StringType(),
19107
- "regex": new basic_1.StringType(),
19108
- "pcre": new basic_1.StringType(),
19109
+ "sub": new basic_1.CLikeType(),
19110
+ "regex": new basic_1.CLikeType(),
19111
+ "pcre": new basic_1.CLikeType(),
19109
19112
  "case": new basic_1.CharacterType(1),
19110
19113
  "off": new basic_1.IntegerType(),
19111
19114
  "len": new basic_1.IntegerType(),
@@ -19130,7 +19133,7 @@ BuiltIn.methods = [
19130
19133
  {
19131
19134
  name: "REVERSE",
19132
19135
  mandatory: {
19133
- "val": new basic_1.StringType(),
19136
+ "val": new basic_1.CLikeType(),
19134
19137
  },
19135
19138
  return: new basic_1.StringType(),
19136
19139
  version: version_1.Version.v702,
@@ -19151,12 +19154,12 @@ BuiltIn.methods = [
19151
19154
  {
19152
19155
  name: "SEGMENT",
19153
19156
  mandatory: {
19154
- "val": new basic_1.StringType(),
19157
+ "val": new basic_1.CLikeType(),
19155
19158
  "index": new basic_1.IntegerType(),
19156
19159
  },
19157
19160
  optional: {
19158
- "sep": new basic_1.StringType(),
19159
- "space": new basic_1.StringType(),
19161
+ "sep": new basic_1.CLikeType(),
19162
+ "space": new basic_1.CLikeType(),
19160
19163
  },
19161
19164
  return: new basic_1.StringType(),
19162
19165
  version: version_1.Version.v702,
@@ -19164,10 +19167,10 @@ BuiltIn.methods = [
19164
19167
  {
19165
19168
  name: "SHIFT_LEFT",
19166
19169
  mandatory: {
19167
- "val": new basic_1.StringType(),
19170
+ "val": new basic_1.CLikeType(),
19168
19171
  },
19169
19172
  optional: {
19170
- "sub": new basic_1.StringType(),
19173
+ "sub": new basic_1.CLikeType(),
19171
19174
  "places": new basic_1.IntegerType(),
19172
19175
  "circular": new basic_1.IntegerType(),
19173
19176
  },
@@ -19177,10 +19180,10 @@ BuiltIn.methods = [
19177
19180
  {
19178
19181
  name: "SHIFT_RIGHT",
19179
19182
  mandatory: {
19180
- "val": new basic_1.StringType(),
19183
+ "val": new basic_1.CLikeType(),
19181
19184
  },
19182
19185
  optional: {
19183
- "sub": new basic_1.StringType(),
19186
+ "sub": new basic_1.CLikeType(),
19184
19187
  "places": new basic_1.IntegerType(),
19185
19188
  "circular": new basic_1.IntegerType(),
19186
19189
  },
@@ -19240,9 +19243,9 @@ BuiltIn.methods = [
19240
19243
  "val": new basic_1.CLikeType(),
19241
19244
  },
19242
19245
  optional: {
19243
- "sub": new basic_1.StringType(),
19244
- "regex": new basic_1.StringType(),
19245
- "pcre": new basic_1.StringType(),
19246
+ "sub": new basic_1.CLikeType(),
19247
+ "regex": new basic_1.CLikeType(),
19248
+ "pcre": new basic_1.CLikeType(),
19246
19249
  "case": new basic_1.CharacterType(1),
19247
19250
  "len": new basic_1.IntegerType(),
19248
19251
  "occ": new basic_1.IntegerType(),
@@ -19256,9 +19259,9 @@ BuiltIn.methods = [
19256
19259
  "val": new basic_1.CLikeType(),
19257
19260
  },
19258
19261
  optional: {
19259
- "sub": new basic_1.StringType(),
19260
- "regex": new basic_1.StringType(),
19261
- "pcre": new basic_1.StringType(),
19262
+ "sub": new basic_1.CLikeType(),
19263
+ "regex": new basic_1.CLikeType(),
19264
+ "pcre": new basic_1.CLikeType(),
19262
19265
  "case": new basic_1.CharacterType(1),
19263
19266
  "len": new basic_1.IntegerType(),
19264
19267
  "occ": new basic_1.IntegerType(),
@@ -19272,9 +19275,9 @@ BuiltIn.methods = [
19272
19275
  "val": new basic_1.CLikeType(),
19273
19276
  },
19274
19277
  optional: {
19275
- "sub": new basic_1.StringType(),
19276
- "regex": new basic_1.StringType(),
19277
- "pcre": new basic_1.StringType(),
19278
+ "sub": new basic_1.CLikeType(),
19279
+ "regex": new basic_1.CLikeType(),
19280
+ "pcre": new basic_1.CLikeType(),
19278
19281
  "case": new basic_1.CharacterType(1),
19279
19282
  "len": new basic_1.IntegerType(),
19280
19283
  "occ": new basic_1.IntegerType(),
@@ -19288,9 +19291,9 @@ BuiltIn.methods = [
19288
19291
  "val": new basic_1.CLikeType(),
19289
19292
  },
19290
19293
  optional: {
19291
- "sub": new basic_1.StringType(),
19292
- "regex": new basic_1.StringType(),
19293
- "pcre": new basic_1.StringType(),
19294
+ "sub": new basic_1.CLikeType(),
19295
+ "regex": new basic_1.CLikeType(),
19296
+ "pcre": new basic_1.CLikeType(),
19294
19297
  "case": new basic_1.CharacterType(1),
19295
19298
  "len": new basic_1.IntegerType(),
19296
19299
  "occ": new basic_1.IntegerType(),
@@ -19315,7 +19318,7 @@ BuiltIn.methods = [
19315
19318
  {
19316
19319
  name: "TO_LOWER",
19317
19320
  mandatory: {
19318
- "val": new basic_1.StringType(),
19321
+ "val": new basic_1.CLikeType(),
19319
19322
  },
19320
19323
  return: new basic_1.StringType(),
19321
19324
  version: version_1.Version.v702,
@@ -19323,7 +19326,7 @@ BuiltIn.methods = [
19323
19326
  {
19324
19327
  name: "TO_MIXED",
19325
19328
  mandatory: {
19326
- "val": new basic_1.StringType(),
19329
+ "val": new basic_1.CLikeType(),
19327
19330
  },
19328
19331
  optional: {
19329
19332
  "case": new basic_1.CharacterType(1),
@@ -19335,16 +19338,16 @@ BuiltIn.methods = [
19335
19338
  },
19336
19339
  {
19337
19340
  name: "TO_UPPER",
19338
- mandatory: { "val": new basic_1.StringType() },
19341
+ mandatory: { "val": new basic_1.CLikeType() },
19339
19342
  return: new basic_1.StringType(),
19340
19343
  version: version_1.Version.v702,
19341
19344
  },
19342
19345
  {
19343
19346
  name: "TRANSLATE",
19344
19347
  mandatory: {
19345
- "val": new basic_1.StringType(),
19346
- "from": new basic_1.StringType(),
19347
- "to": new basic_1.StringType(),
19348
+ "val": new basic_1.CLikeType(),
19349
+ "from": new basic_1.CLikeType(),
19350
+ "to": new basic_1.CLikeType(),
19348
19351
  },
19349
19352
  return: new basic_1.StringType(),
19350
19353
  version: version_1.Version.v702,
@@ -19387,7 +19390,7 @@ BuiltIn.methods = [
19387
19390
  {
19388
19391
  name: "XSDBOOL",
19389
19392
  mandatory: {
19390
- "val": new basic_1.StringType(),
19393
+ "val": new basic_1.CLikeType(),
19391
19394
  },
19392
19395
  return: new basic_1.CharacterType(1),
19393
19396
  version: version_1.Version.v740sp08,
@@ -19738,6 +19741,9 @@ class CurrentScope {
19738
19741
  getDDICReferences() {
19739
19742
  return this.reg.getDDICReferences();
19740
19743
  }
19744
+ getMSAGReferences() {
19745
+ return this.reg.getMSAGReferences();
19746
+ }
19741
19747
  getParentObj() {
19742
19748
  return this.parentObj;
19743
19749
  }
@@ -20604,7 +20610,7 @@ class TypeUtils {
20604
20610
  return false;
20605
20611
  }
20606
20612
  isAssignableStrict(source, target) {
20607
- var _a, _b, _c, _d;
20613
+ var _a, _b, _c, _d, _e;
20608
20614
  /*
20609
20615
  console.dir(source);
20610
20616
  console.dir(target);
@@ -20622,16 +20628,22 @@ class TypeUtils {
20622
20628
  }
20623
20629
  return false;
20624
20630
  }
20631
+ else if (target instanceof basic_1.StringType) {
20632
+ if (((_c = source.getAbstractTypeData()) === null || _c === void 0 ? void 0 : _c.derivedFromConstant) === true) {
20633
+ return true;
20634
+ }
20635
+ return false;
20636
+ }
20625
20637
  }
20626
20638
  else if (source instanceof basic_1.HexType) {
20627
20639
  if (target instanceof basic_1.HexType) {
20628
- if (((_c = source.getAbstractTypeData()) === null || _c === void 0 ? void 0 : _c.derivedFromConstant) === true) {
20640
+ if (((_d = source.getAbstractTypeData()) === null || _d === void 0 ? void 0 : _d.derivedFromConstant) === true) {
20629
20641
  return source.getLength() <= target.getLength();
20630
20642
  }
20631
20643
  return source.getLength() === target.getLength();
20632
20644
  }
20633
20645
  else if (target instanceof basic_1.IntegerType) {
20634
- if (((_d = source.getAbstractTypeData()) === null || _d === void 0 ? void 0 : _d.derivedFromConstant) === true) {
20646
+ if (((_e = source.getAbstractTypeData()) === null || _e === void 0 ? void 0 : _e.derivedFromConstant) === true) {
20635
20647
  return true;
20636
20648
  }
20637
20649
  return false;
@@ -23287,9 +23299,26 @@ const Expressions = __webpack_require__(/*! ../../2_statements/expressions */ ".
23287
23299
  const source_1 = __webpack_require__(/*! ./source */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/expressions/source.js");
23288
23300
  class MessageSource {
23289
23301
  runSyntax(node, scope, filename) {
23302
+ var _a, _b, _c, _d;
23290
23303
  for (const f of node.findDirectExpressions(Expressions.Source)) {
23291
23304
  new source_1.Source().runSyntax(f, scope, filename);
23292
23305
  }
23306
+ if (node.getFirstToken().getStr().toUpperCase() === "ID") {
23307
+ const id = (_a = node.findExpressionAfterToken("ID")) === null || _a === void 0 ? void 0 : _a.concatTokens();
23308
+ const number = (_b = node.findDirectExpression(Expressions.MessageNumber)) === null || _b === void 0 ? void 0 : _b.concatTokens();
23309
+ if ((id === null || id === void 0 ? void 0 : id.startsWith("'")) && number) {
23310
+ const messageClass = id.substring(1, id.length - 1).toUpperCase();
23311
+ scope.getMSAGReferences().addUsing(filename, node.getFirstToken(), messageClass, number);
23312
+ }
23313
+ }
23314
+ else {
23315
+ const typeAndNumber = (_c = node.findDirectExpression(Expressions.MessageTypeAndNumber)) === null || _c === void 0 ? void 0 : _c.concatTokens();
23316
+ const messageNumber = typeAndNumber === null || typeAndNumber === void 0 ? void 0 : typeAndNumber.substring(1);
23317
+ const messageClass = (_d = node.findDirectExpression(Expressions.MessageClass)) === null || _d === void 0 ? void 0 : _d.concatTokens().toUpperCase();
23318
+ if (messageNumber && messageClass) {
23319
+ scope.getMSAGReferences().addUsing(filename, node.getFirstToken(), messageClass, messageNumber);
23320
+ }
23321
+ }
23293
23322
  }
23294
23323
  }
23295
23324
  exports.MessageSource = MessageSource;
@@ -28680,7 +28709,7 @@ const raise_with_1 = __webpack_require__(/*! ../expressions/raise_with */ "./nod
28680
28709
  class Raise {
28681
28710
  runSyntax(node, scope, filename) {
28682
28711
  // todo
28683
- var _a;
28712
+ var _a, _b, _c;
28684
28713
  const classTok = (_a = node.findDirectExpression(Expressions.ClassName)) === null || _a === void 0 ? void 0 : _a.getFirstToken();
28685
28714
  const classNam = classTok === null || classTok === void 0 ? void 0 : classTok.getStr();
28686
28715
  if (classNam) {
@@ -28729,6 +28758,12 @@ class Raise {
28729
28758
  for (const s of node.findDirectExpressions(Expressions.MessageSource)) {
28730
28759
  new message_source_1.MessageSource().runSyntax(s, scope, filename);
28731
28760
  }
28761
+ const id = (_b = node.findExpressionAfterToken("ID")) === null || _b === void 0 ? void 0 : _b.concatTokens();
28762
+ const number = (_c = node.findDirectExpression(Expressions.MessageNumber)) === null || _c === void 0 ? void 0 : _c.concatTokens();
28763
+ if ((id === null || id === void 0 ? void 0 : id.startsWith("'")) && number) {
28764
+ const messageClass = id.substring(1, id.length - 1).toUpperCase();
28765
+ scope.getMSAGReferences().addUsing(filename, node.getFirstToken(), messageClass, number);
28766
+ }
28732
28767
  }
28733
28768
  }
28734
28769
  exports.Raise = Raise;
@@ -29772,7 +29807,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
29772
29807
  exports.Tables = void 0;
29773
29808
  const Expressions = __webpack_require__(/*! ../../2_statements/expressions */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js");
29774
29809
  const _typed_identifier_1 = __webpack_require__(/*! ../../types/_typed_identifier */ "./node_modules/@abaplint/core/build/src/abap/types/_typed_identifier.js");
29775
- const basic_1 = __webpack_require__(/*! ../../types/basic */ "./node_modules/@abaplint/core/build/src/abap/types/basic/index.js");
29810
+ const unknown_type_1 = __webpack_require__(/*! ../../types/basic/unknown_type */ "./node_modules/@abaplint/core/build/src/abap/types/basic/unknown_type.js");
29776
29811
  class Tables {
29777
29812
  runSyntax(node, scope, filename) {
29778
29813
  var _a, _b;
@@ -29784,13 +29819,15 @@ class Tables {
29784
29819
  if (name.startsWith("*")) {
29785
29820
  name = name.substr(1);
29786
29821
  }
29822
+ // lookupTableOrView will also give Unknown and Void
29787
29823
  const found = (_b = scope.getDDIC()) === null || _b === void 0 ? void 0 : _b.lookupTableOrView(name);
29788
29824
  if (found) {
29789
29825
  scope.getDDICReferences().addUsing(scope.getParentObj(), { object: found.object, filename: filename, token: nameToken });
29790
29826
  scope.addIdentifier(new _typed_identifier_1.TypedIdentifier(nameToken, filename, found.type));
29791
29827
  return;
29792
29828
  }
29793
- scope.addIdentifier(new _typed_identifier_1.TypedIdentifier(nameToken, filename, new basic_1.UnknownType("Tables, fallback")));
29829
+ // this should never happen,
29830
+ scope.addIdentifier(new _typed_identifier_1.TypedIdentifier(nameToken, filename, new unknown_type_1.UnknownType("Tables, fallback")));
29794
29831
  }
29795
29832
  }
29796
29833
  exports.Tables = Tables;
@@ -30996,6 +31033,7 @@ class SyntaxLogic {
30996
31033
  }
30997
31034
  this.issues = [];
30998
31035
  this.reg.getDDICReferences().clear(this.object);
31036
+ this.reg.getMSAGReferences().clear(this.object);
30999
31037
  if (this.object instanceof objects_1.Program && this.object.isInclude()) {
31000
31038
  // todo, show some kind of error?
31001
31039
  return { issues: [], spaghetti: this.scope.pop(new position_1.Position(Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER)) };
@@ -35030,21 +35068,21 @@ exports.InterfaceDefinition = InterfaceDefinition;
35030
35068
  Object.defineProperty(exports, "__esModule", ({ value: true }));
35031
35069
  exports.Message = void 0;
35032
35070
  class Message {
35033
- constructor(num, msg) {
35034
- this.num = num;
35035
- if (this.num === undefined) {
35036
- this.num = "";
35071
+ constructor(number, message) {
35072
+ this.number = number;
35073
+ if (this.number === undefined) {
35074
+ this.number = "";
35037
35075
  }
35038
- this.msg = msg;
35039
- if (this.msg === undefined) {
35040
- this.msg = "";
35076
+ this.message = message;
35077
+ if (this.message === undefined) {
35078
+ this.message = "";
35041
35079
  }
35042
35080
  }
35043
35081
  getNumber() {
35044
- return this.num;
35082
+ return this.number;
35045
35083
  }
35046
35084
  getMessage() {
35047
- return this.msg;
35085
+ return this.message;
35048
35086
  }
35049
35087
  getPlaceholderCount() {
35050
35088
  return (this.getMessage().match(/&/g) || []).length;
@@ -37359,10 +37397,11 @@ class DDICReferences {
37359
37397
  }
37360
37398
  }
37361
37399
  }
37362
- const newName = obj.getName().toUpperCase();
37363
- const newType = obj.getType();
37364
- if ((_b = this.nameTypeIndex[newName]) === null || _b === void 0 ? void 0 : _b[newType]) {
37365
- this.nameTypeIndex[newName][newType] = [];
37400
+ // remove from name + type index
37401
+ const name = obj.getName().toUpperCase();
37402
+ const type = obj.getType();
37403
+ if ((_b = this.nameTypeIndex[name]) === null || _b === void 0 ? void 0 : _b[type]) {
37404
+ this.nameTypeIndex[name][type] = [];
37366
37405
  }
37367
37406
  }
37368
37407
  listByFilename(filename, line) {
@@ -38435,21 +38474,27 @@ class LSPLookup {
38435
38474
  const hover = "Method Definition \"" + method.getName() + "\"";
38436
38475
  return { hover, definition: found, definitionId: method, scope: bottomScope };
38437
38476
  }
38477
+ let hoverValue = "";
38478
+ const ddicRefs = reg.getDDICReferences().listByFilename(cursor.identifier.getFilename(), cursor.identifier.getStart().getRow());
38479
+ for (const d of ddicRefs) {
38480
+ if (d.object && d.token && d.token.getStart().equals(cursor.identifier.getStart())) {
38481
+ hoverValue += `DDIC: ${d.object.getType()} ${d.object.getName()}`;
38482
+ }
38483
+ }
38438
38484
  const variable = bottomScope.findVariable(cursor.token.getStr());
38439
38485
  if (variable !== undefined && variable.getStart().equals(cursor.token.getStart())) {
38440
38486
  const hover = "Variable Definition\n\n" + this.dumpType(variable);
38487
+ if (hoverValue !== "") {
38488
+ hoverValue = hover + "\n_________________\n" + hoverValue;
38489
+ }
38490
+ else {
38491
+ hoverValue = hover;
38492
+ }
38441
38493
  let location = undefined;
38442
38494
  if (variable.getMeta().includes("built-in" /* IdentifierMeta.BuiltIn */) === false) {
38443
38495
  location = _lsp_utils_1.LSPUtils.identiferToLocation(variable);
38444
38496
  }
38445
- return { hover, definition: location, implementation: location, definitionId: variable, scope: bottomScope };
38446
- }
38447
- let hoverValue = "";
38448
- const ddicRefs = reg.getDDICReferences().listByFilename(cursor.identifier.getFilename(), cursor.identifier.getStart().getRow());
38449
- for (const d of ddicRefs) {
38450
- if (d.object && d.token && d.token.getStart().equals(cursor.identifier.getStart())) {
38451
- hoverValue += `DDIC: ${d.object.getType()} ${d.object.getName()}`;
38452
- }
38497
+ return { hover: hoverValue, definition: location, implementation: location, definitionId: variable, scope: bottomScope };
38453
38498
  }
38454
38499
  const refs = this.searchReferences(bottomScope, cursor.token);
38455
38500
  if (refs.length > 0) {
@@ -38861,6 +38906,53 @@ exports.CodeActions = CodeActions;
38861
38906
 
38862
38907
  /***/ }),
38863
38908
 
38909
+ /***/ "./node_modules/@abaplint/core/build/src/lsp/code_lens.js":
38910
+ /*!****************************************************************!*\
38911
+ !*** ./node_modules/@abaplint/core/build/src/lsp/code_lens.js ***!
38912
+ \****************************************************************/
38913
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
38914
+
38915
+ "use strict";
38916
+
38917
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
38918
+ exports.CodeLens = void 0;
38919
+ const LServer = __webpack_require__(/*! vscode-languageserver-types */ "./node_modules/vscode-languageserver-types/lib/esm/main.js");
38920
+ const _lsp_utils_1 = __webpack_require__(/*! ./_lsp_utils */ "./node_modules/@abaplint/core/build/src/lsp/_lsp_utils.js");
38921
+ const syntax_1 = __webpack_require__(/*! ../abap/5_syntax/syntax */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/syntax.js");
38922
+ const _abap_object_1 = __webpack_require__(/*! ../objects/_abap_object */ "./node_modules/@abaplint/core/build/src/objects/_abap_object.js");
38923
+ class CodeLens {
38924
+ constructor(reg) {
38925
+ this.reg = reg;
38926
+ }
38927
+ list(textDocument) {
38928
+ var _a;
38929
+ const file = _lsp_utils_1.LSPUtils.getABAPFile(this.reg, textDocument.uri);
38930
+ if (file === undefined) {
38931
+ return [];
38932
+ }
38933
+ const obj = this.reg.findObjectForFile(file);
38934
+ if (obj === undefined || !(obj instanceof _abap_object_1.ABAPObject)) {
38935
+ return [];
38936
+ }
38937
+ new syntax_1.SyntaxLogic(this.reg, obj).run();
38938
+ const ret = [];
38939
+ const list = this.reg.getMSAGReferences().listByFilename(file.getFilename());
38940
+ for (const l of list) {
38941
+ const msag = this.reg.getObject("MSAG", l.messageClass);
38942
+ if (msag === undefined) {
38943
+ continue;
38944
+ }
38945
+ const text = (_a = msag.getByNumber(l.number)) === null || _a === void 0 ? void 0 : _a.getMessage();
38946
+ ret.push(LServer.CodeLens.create(_lsp_utils_1.LSPUtils.tokenToRange(l.token), text));
38947
+ }
38948
+ return ret;
38949
+ }
38950
+ }
38951
+ exports.CodeLens = CodeLens;
38952
+ //# sourceMappingURL=code_lens.js.map
38953
+
38954
+ /***/ }),
38955
+
38864
38956
  /***/ "./node_modules/@abaplint/core/build/src/lsp/definition.js":
38865
38957
  /*!*****************************************************************!*\
38866
38958
  !*** ./node_modules/@abaplint/core/build/src/lsp/definition.js ***!
@@ -39558,6 +39650,7 @@ const references_1 = __webpack_require__(/*! ./references */ "./node_modules/@ab
39558
39650
  const implementation_1 = __webpack_require__(/*! ./implementation */ "./node_modules/@abaplint/core/build/src/lsp/implementation.js");
39559
39651
  const semantic_1 = __webpack_require__(/*! ./semantic */ "./node_modules/@abaplint/core/build/src/lsp/semantic.js");
39560
39652
  const statement_flow_1 = __webpack_require__(/*! ../abap/flow/statement_flow */ "./node_modules/@abaplint/core/build/src/abap/flow/statement_flow.js");
39653
+ const code_lens_1 = __webpack_require__(/*! ./code_lens */ "./node_modules/@abaplint/core/build/src/lsp/code_lens.js");
39561
39654
  // note Ranges are zero based in LSP,
39562
39655
  // https://github.com/microsoft/language-server-protocol/blob/main/versions/protocol-2-x.md#range
39563
39656
  // but 1 based in abaplint
@@ -39638,6 +39731,10 @@ class LanguageServer {
39638
39731
  semanticTokensRange(range) {
39639
39732
  return new semantic_1.SemanticHighlighting(this.reg).semanticTokensRange(range);
39640
39733
  }
39734
+ // https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_codeLens
39735
+ codeLens(textDocument) {
39736
+ return new code_lens_1.CodeLens(this.reg).list(textDocument);
39737
+ }
39641
39738
  ////////////////////////////////////////
39642
39739
  // ______ _
39643
39740
  // | ____| | |
@@ -40121,6 +40218,65 @@ exports.Symbols = Symbols;
40121
40218
 
40122
40219
  /***/ }),
40123
40220
 
40221
+ /***/ "./node_modules/@abaplint/core/build/src/msag_references.js":
40222
+ /*!******************************************************************!*\
40223
+ !*** ./node_modules/@abaplint/core/build/src/msag_references.js ***!
40224
+ \******************************************************************/
40225
+ /***/ ((__unused_webpack_module, exports) => {
40226
+
40227
+ "use strict";
40228
+
40229
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
40230
+ exports.MSAGReferences = void 0;
40231
+ class MSAGReferences {
40232
+ constructor() {
40233
+ this.nameNumberIndex = {};
40234
+ this.filenameIndex = {};
40235
+ }
40236
+ addUsing(filename, token, messageClass, number) {
40237
+ if (this.filenameIndex[filename] === undefined) {
40238
+ this.filenameIndex[filename] = [];
40239
+ }
40240
+ this.filenameIndex[filename].push({
40241
+ token: token,
40242
+ messageClass: messageClass,
40243
+ number: number,
40244
+ });
40245
+ if (this.nameNumberIndex[messageClass] === undefined) {
40246
+ this.nameNumberIndex[messageClass] = {};
40247
+ }
40248
+ if (this.nameNumberIndex[messageClass][number] === undefined) {
40249
+ this.nameNumberIndex[messageClass][number] = [];
40250
+ }
40251
+ this.nameNumberIndex[messageClass][number].push({
40252
+ filename: filename,
40253
+ token: token,
40254
+ });
40255
+ }
40256
+ clear(obj) {
40257
+ for (const file of obj.getFiles()) {
40258
+ const filename = file.getFilename();
40259
+ for (const fIndex of this.filenameIndex[filename] || []) {
40260
+ // this should be okay for performance, each message should be referenced less than 10 times typically
40261
+ this.nameNumberIndex[fIndex.messageClass][fIndex.number] =
40262
+ this.nameNumberIndex[fIndex.messageClass][fIndex.number].filter(i => i.filename !== filename);
40263
+ }
40264
+ delete this.filenameIndex[filename];
40265
+ }
40266
+ }
40267
+ listByFilename(filename) {
40268
+ return this.filenameIndex[filename] || [];
40269
+ }
40270
+ listByMessage(messageClass, number) {
40271
+ var _a;
40272
+ return ((_a = this.nameNumberIndex[messageClass]) === null || _a === void 0 ? void 0 : _a[number]) || [];
40273
+ }
40274
+ }
40275
+ exports.MSAGReferences = MSAGReferences;
40276
+ //# sourceMappingURL=msag_references.js.map
40277
+
40278
+ /***/ }),
40279
+
40124
40280
  /***/ "./node_modules/@abaplint/core/build/src/objects/_abap_object.js":
40125
40281
  /*!***********************************************************************!*\
40126
40282
  !*** ./node_modules/@abaplint/core/build/src/objects/_abap_object.js ***!
@@ -43634,6 +43790,7 @@ class MessageClass extends _abstract_object_1.AbstractObject {
43634
43790
  return msg ? msg : [];
43635
43791
  }
43636
43792
  getByNumber(num) {
43793
+ // todo, optimize performance,
43637
43794
  for (const message of this.getMessages()) {
43638
43795
  if (message.getNumber() === num) {
43639
43796
  return message;
@@ -44037,10 +44194,6 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
44037
44194
  exports.Program = void 0;
44038
44195
  const _abap_object_1 = __webpack_require__(/*! ./_abap_object */ "./node_modules/@abaplint/core/build/src/objects/_abap_object.js");
44039
44196
  class Program extends _abap_object_1.ABAPObject {
44040
- constructor() {
44041
- super(...arguments);
44042
- this.isIncludeValue = undefined;
44043
- }
44044
44197
  getType() {
44045
44198
  return "PROG";
44046
44199
  }
@@ -44062,15 +44215,25 @@ class Program extends _abap_object_1.ABAPObject {
44062
44215
  };
44063
44216
  }
44064
44217
  setDirty() {
44065
- this.isIncludeValue = undefined;
44218
+ this.parsedXML = undefined;
44066
44219
  super.setDirty();
44067
44220
  }
44068
44221
  isInclude() {
44069
- if (this.isIncludeValue === undefined) {
44222
+ this.parseXML();
44223
+ return this.parsedXML.isInclude;
44224
+ }
44225
+ isModulePool() {
44226
+ this.parseXML();
44227
+ return this.parsedXML.isModulePool;
44228
+ }
44229
+ parseXML() {
44230
+ if (this.parsedXML === undefined) {
44070
44231
  const file = this.getXMLFile();
44071
- this.isIncludeValue = file ? file.getRaw().includes("<SUBC>I</SUBC>") : false;
44232
+ this.parsedXML = {
44233
+ isInclude: file ? file.getRaw().includes("<SUBC>I</SUBC>") : false,
44234
+ isModulePool: file ? file.getRaw().includes("<SUBC>M</SUBC>") : false,
44235
+ };
44072
44236
  }
44073
- return this.isIncludeValue;
44074
44237
  }
44075
44238
  }
44076
44239
  exports.Program = Program;
@@ -46589,6 +46752,7 @@ const find_global_definitions_1 = __webpack_require__(/*! ./abap/5_syntax/global
46589
46752
  const excludeHelper_1 = __webpack_require__(/*! ./utils/excludeHelper */ "./node_modules/@abaplint/core/build/src/utils/excludeHelper.js");
46590
46753
  const ddic_references_1 = __webpack_require__(/*! ./ddic_references */ "./node_modules/@abaplint/core/build/src/ddic_references.js");
46591
46754
  const rules_runner_1 = __webpack_require__(/*! ./rules_runner */ "./node_modules/@abaplint/core/build/src/rules_runner.js");
46755
+ const msag_references_1 = __webpack_require__(/*! ./msag_references */ "./node_modules/@abaplint/core/build/src/msag_references.js");
46592
46756
  // todo, this should really be an instance in case there are multiple Registry'ies
46593
46757
  class ParsingPerformance {
46594
46758
  static clear() {
@@ -46641,14 +46805,18 @@ class Registry {
46641
46805
  this.objectsByType = {};
46642
46806
  this.dependencies = {};
46643
46807
  this.conf = conf ? conf : config_1.Config.getDefault();
46644
- this.references = new ddic_references_1.DDICReferences();
46808
+ this.ddicReferences = new ddic_references_1.DDICReferences();
46809
+ this.msagReferences = new msag_references_1.MSAGReferences();
46645
46810
  }
46646
46811
  static abaplintVersion() {
46647
46812
  // magic, see build script "version.sh"
46648
- return "2.99.7";
46813
+ return "2.100.2";
46649
46814
  }
46650
46815
  getDDICReferences() {
46651
- return this.references;
46816
+ return this.ddicReferences;
46817
+ }
46818
+ getMSAGReferences() {
46819
+ return this.msagReferences;
46652
46820
  }
46653
46821
  *getObjects() {
46654
46822
  for (const name in this.objects) {
@@ -46736,7 +46904,8 @@ class Registry {
46736
46904
  const obj = this.find(file.getObjectName(), file.getObjectType());
46737
46905
  obj.removeFile(file);
46738
46906
  if (obj.getFiles().length === 0) {
46739
- this.references.clear(obj);
46907
+ this.ddicReferences.clear(obj);
46908
+ this.msagReferences.clear(obj);
46740
46909
  this.removeObject(obj);
46741
46910
  }
46742
46911
  return this;
@@ -53942,6 +54111,88 @@ exports.Downport = Downport;
53942
54111
 
53943
54112
  /***/ }),
53944
54113
 
54114
+ /***/ "./node_modules/@abaplint/core/build/src/rules/easy_to_find_messages.js":
54115
+ /*!******************************************************************************!*\
54116
+ !*** ./node_modules/@abaplint/core/build/src/rules/easy_to_find_messages.js ***!
54117
+ \******************************************************************************/
54118
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
54119
+
54120
+ "use strict";
54121
+
54122
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
54123
+ exports.EasyToFindMessages = exports.EasyToFindMessagesConf = void 0;
54124
+ const issue_1 = __webpack_require__(/*! ../issue */ "./node_modules/@abaplint/core/build/src/issue.js");
54125
+ const _irule_1 = __webpack_require__(/*! ./_irule */ "./node_modules/@abaplint/core/build/src/rules/_irule.js");
54126
+ const _basic_rule_config_1 = __webpack_require__(/*! ./_basic_rule_config */ "./node_modules/@abaplint/core/build/src/rules/_basic_rule_config.js");
54127
+ const position_1 = __webpack_require__(/*! ../position */ "./node_modules/@abaplint/core/build/src/position.js");
54128
+ const syntax_1 = __webpack_require__(/*! ../abap/5_syntax/syntax */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/syntax.js");
54129
+ const _abap_object_1 = __webpack_require__(/*! ../objects/_abap_object */ "./node_modules/@abaplint/core/build/src/objects/_abap_object.js");
54130
+ class EasyToFindMessagesConf extends _basic_rule_config_1.BasicRuleConfig {
54131
+ }
54132
+ exports.EasyToFindMessagesConf = EasyToFindMessagesConf;
54133
+ class EasyToFindMessages {
54134
+ constructor() {
54135
+ this.conf = new EasyToFindMessagesConf();
54136
+ }
54137
+ getMetadata() {
54138
+ return {
54139
+ key: "easy_to_find_messages",
54140
+ title: "Easy to find messages",
54141
+ shortDescription: `Make messages easy to find`,
54142
+ extendedInformation: `All messages must be statically referenced exactly once
54143
+
54144
+ Only MESSAGE and RAISE statments are counted as static references
54145
+
54146
+ Also see rule "message_exists"
54147
+
54148
+ https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#make-messages-easy-to-find`,
54149
+ tags: [_irule_1.RuleTag.Styleguide],
54150
+ };
54151
+ }
54152
+ getConfig() {
54153
+ return this.conf;
54154
+ }
54155
+ setConfig(conf) {
54156
+ this.conf = conf;
54157
+ }
54158
+ initialize(reg) {
54159
+ this.msagReferences = reg.getMSAGReferences();
54160
+ // the SyntaxLogic builds the references
54161
+ for (const obj of reg.getObjects()) {
54162
+ if (obj instanceof _abap_object_1.ABAPObject) {
54163
+ new syntax_1.SyntaxLogic(reg, obj).run();
54164
+ }
54165
+ }
54166
+ return this;
54167
+ }
54168
+ run(object) {
54169
+ const issues = [];
54170
+ if (object.getType() === "MSAG") {
54171
+ const msag = object;
54172
+ for (const message of msag.getMessages()) {
54173
+ const where = this.msagReferences.listByMessage(msag.getName().toUpperCase(), message.getNumber());
54174
+ if (where.length === 0) {
54175
+ const text = `Message ${message.getNumber()} not statically referenced`;
54176
+ const position = new position_1.Position(1, 1);
54177
+ const issue = issue_1.Issue.atPosition(object.getFiles()[0], position, text, this.getMetadata().key, this.conf.severity);
54178
+ issues.push(issue);
54179
+ }
54180
+ else if (where.length >= 2) {
54181
+ const text = `Message ${message.getNumber()} referenced more than once`;
54182
+ const position = new position_1.Position(1, 1);
54183
+ const issue = issue_1.Issue.atPosition(object.getFiles()[0], position, text, this.getMetadata().key, this.conf.severity);
54184
+ issues.push(issue);
54185
+ }
54186
+ }
54187
+ }
54188
+ return issues;
54189
+ }
54190
+ }
54191
+ exports.EasyToFindMessages = EasyToFindMessages;
54192
+ //# sourceMappingURL=easy_to_find_messages.js.map
54193
+
54194
+ /***/ }),
54195
+
53945
54196
  /***/ "./node_modules/@abaplint/core/build/src/rules/empty_line_in_statement.js":
53946
54197
  /*!********************************************************************************!*\
53947
54198
  !*** ./node_modules/@abaplint/core/build/src/rules/empty_line_in_statement.js ***!
@@ -56550,6 +56801,7 @@ __exportStar(__webpack_require__(/*! ./definitions_top */ "./node_modules/@abapl
56550
56801
  __exportStar(__webpack_require__(/*! ./description_empty */ "./node_modules/@abaplint/core/build/src/rules/description_empty.js"), exports);
56551
56802
  __exportStar(__webpack_require__(/*! ./double_space */ "./node_modules/@abaplint/core/build/src/rules/double_space.js"), exports);
56552
56803
  __exportStar(__webpack_require__(/*! ./downport */ "./node_modules/@abaplint/core/build/src/rules/downport.js"), exports);
56804
+ __exportStar(__webpack_require__(/*! ./easy_to_find_messages */ "./node_modules/@abaplint/core/build/src/rules/easy_to_find_messages.js"), exports);
56553
56805
  __exportStar(__webpack_require__(/*! ./empty_line_in_statement */ "./node_modules/@abaplint/core/build/src/rules/empty_line_in_statement.js"), exports);
56554
56806
  __exportStar(__webpack_require__(/*! ./empty_statement */ "./node_modules/@abaplint/core/build/src/rules/empty_statement.js"), exports);
56555
56807
  __exportStar(__webpack_require__(/*! ./empty_structure */ "./node_modules/@abaplint/core/build/src/rules/empty_structure.js"), exports);
@@ -57958,7 +58210,9 @@ class MainFileContents {
57958
58210
  if (stru === undefined) {
57959
58211
  return [];
57960
58212
  }
57961
- if (obj instanceof Objects.Program && obj.isInclude() === false) {
58213
+ if (obj instanceof Objects.Program
58214
+ && obj.isInclude() === false
58215
+ && obj.isModulePool() === false) {
57962
58216
  let count = 0;
57963
58217
  let first = main.getStatements()[count];
57964
58218
  while (first !== undefined && first.get() instanceof _statement_1.Comment) {
@@ -59019,6 +59273,7 @@ class MSAGConsistency {
59019
59273
  key: "msag_consistency",
59020
59274
  title: "MSAG consistency check",
59021
59275
  shortDescription: `Checks the validity of messages in message classes`,
59276
+ extendedInformation: `Message numbers must be 3 digits, and message text must not be empty`,
59022
59277
  };
59023
59278
  }
59024
59279
  getDescription(reason) {
@@ -62630,6 +62885,10 @@ If the target is a sorted/hashed table, no issue is reported`,
62630
62885
  if (this.isTargetSortedOrHashed(s, spaghetti, file)) {
62631
62886
  continue;
62632
62887
  }
62888
+ else if (s.findFirstExpression(Expressions.SQLJoin) && s.findFirstExpression(Expressions.SQLForAllEntries)) {
62889
+ // see https://github.com/abaplint/abaplint/issues/2957
62890
+ continue;
62891
+ }
62633
62892
  issues.push(issue_1.Issue.atStatement(file, s, "Add ORDER BY", this.getMetadata().key, this.conf.severity));
62634
62893
  }
62635
62894
  }
@@ -64013,7 +64272,6 @@ Activates from v750 and up`,
64013
64272
  const message = "INTO/APPENDING must be last in strict SQL";
64014
64273
  const issue = issue_1.Issue.atToken(file, s.getFirstToken(), message, this.getMetadata().key, this.conf.severity, fix);
64015
64274
  issues.push(issue);
64016
- break;
64017
64275
  }
64018
64276
  }
64019
64277
  return issues;
@@ -71888,6 +72146,27 @@ exports.AtTranspiler = AtTranspiler;
71888
72146
 
71889
72147
  /***/ }),
71890
72148
 
72149
+ /***/ "./node_modules/@abaplint/transpiler/build/src/statements/at_selection_screen.js":
72150
+ /*!***************************************************************************************!*\
72151
+ !*** ./node_modules/@abaplint/transpiler/build/src/statements/at_selection_screen.js ***!
72152
+ \***************************************************************************************/
72153
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
72154
+
72155
+ "use strict";
72156
+
72157
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
72158
+ exports.AtSelectionScreenTranspiler = void 0;
72159
+ const chunk_1 = __webpack_require__(/*! ../chunk */ "./node_modules/@abaplint/transpiler/build/src/chunk.js");
72160
+ class AtSelectionScreenTranspiler {
72161
+ transpile(_node, _traversal) {
72162
+ return new chunk_1.Chunk(`throw new Error("AtSelectionScreen, not supported, transpiler");`);
72163
+ }
72164
+ }
72165
+ exports.AtSelectionScreenTranspiler = AtSelectionScreenTranspiler;
72166
+ //# sourceMappingURL=at_selection_screen.js.map
72167
+
72168
+ /***/ }),
72169
+
71891
72170
  /***/ "./node_modules/@abaplint/transpiler/build/src/statements/authority_check.js":
71892
72171
  /*!***********************************************************************************!*\
71893
72172
  !*** ./node_modules/@abaplint/transpiler/build/src/statements/authority_check.js ***!
@@ -74136,6 +74415,7 @@ __exportStar(__webpack_require__(/*! ./add */ "./node_modules/@abaplint/transpil
74136
74415
  __exportStar(__webpack_require__(/*! ./append */ "./node_modules/@abaplint/transpiler/build/src/statements/append.js"), exports);
74137
74416
  __exportStar(__webpack_require__(/*! ./assert */ "./node_modules/@abaplint/transpiler/build/src/statements/assert.js"), exports);
74138
74417
  __exportStar(__webpack_require__(/*! ./assign */ "./node_modules/@abaplint/transpiler/build/src/statements/assign.js"), exports);
74418
+ __exportStar(__webpack_require__(/*! ./at_selection_screen */ "./node_modules/@abaplint/transpiler/build/src/statements/at_selection_screen.js"), exports);
74139
74419
  __exportStar(__webpack_require__(/*! ./at */ "./node_modules/@abaplint/transpiler/build/src/statements/at.js"), exports);
74140
74420
  __exportStar(__webpack_require__(/*! ./authority_check */ "./node_modules/@abaplint/transpiler/build/src/statements/authority_check.js"), exports);
74141
74421
  __exportStar(__webpack_require__(/*! ./break_id */ "./node_modules/@abaplint/transpiler/build/src/statements/break_id.js"), exports);
@@ -74876,6 +75156,11 @@ class MethodImplementationTranspiler {
74876
75156
  const method = this.findMethod(methodName, classDef, traversal);
74877
75157
  let staticMethod = "";
74878
75158
  methodName = methodName.replace("~", "$").toLowerCase();
75159
+ if (methodName === "then") {
75160
+ // todo, this should be a checked in the validation step, but no abaplint rule for it?
75161
+ // it messes up promises when "this" is returned
75162
+ throw new Error(`Method name "then" not allowed`);
75163
+ }
74879
75164
  const superDef = traversal.findClassDefinition(classDef === null || classDef === void 0 ? void 0 : classDef.getSuperClass(), scope);
74880
75165
  for (const a of (superDef === null || superDef === void 0 ? void 0 : superDef.getAliases().getAll()) || []) {
74881
75166
  if (a.getName().toLowerCase() === methodName) {
@@ -75773,6 +76058,7 @@ class SelectTranspiler {
75773
76058
  var _a;
75774
76059
  let target = "undefined";
75775
76060
  if (targetOverride) {
76061
+ // SelectLoop structure uses override
75776
76062
  target = targetOverride;
75777
76063
  }
75778
76064
  else if (node.findFirstExpression(abaplint.Expressions.SQLIntoTable)) {
@@ -75834,8 +76120,12 @@ class SelectTranspiler {
75834
76120
  select += "UP TO 1 ROWS";
75835
76121
  }
75836
76122
  let runtimeOptions = "";
76123
+ const runtimeOptionsList = [];
75837
76124
  if (node.concatTokens().toUpperCase().includes(" APPENDING TABLE ")) {
75838
- runtimeOptions = `, {appending: true}`;
76125
+ runtimeOptionsList.push(`appending: true`);
76126
+ }
76127
+ if (runtimeOptionsList.length > 0) {
76128
+ runtimeOptions = `, {` + runtimeOptionsList.join(", ") + `}`;
75839
76129
  }
75840
76130
  let extra = "";
75841
76131
  const keys = this.findKeys(node, traversal);
@@ -77710,6 +78000,7 @@ exports.LoopTranspiler = LoopTranspiler;
77710
78000
 
77711
78001
  Object.defineProperty(exports, "__esModule", ({ value: true }));
77712
78002
  exports.SelectTranspiler = void 0;
78003
+ /* eslint-disable max-len */
77713
78004
  const abaplint = __webpack_require__(/*! @abaplint/core */ "./node_modules/@abaplint/core/build/src/index.js");
77714
78005
  const select_1 = __webpack_require__(/*! ../statements/select */ "./node_modules/@abaplint/transpiler/build/src/statements/select.js");
77715
78006
  const chunk_1 = __webpack_require__(/*! ../chunk */ "./node_modules/@abaplint/transpiler/build/src/chunk.js");
@@ -77717,7 +78008,7 @@ const unique_identifier_1 = __webpack_require__(/*! ../unique_identifier */ "./n
77717
78008
  const expressions_1 = __webpack_require__(/*! ../expressions */ "./node_modules/@abaplint/transpiler/build/src/expressions/index.js");
77718
78009
  class SelectTranspiler {
77719
78010
  transpile(node, traversal) {
77720
- var _a;
78011
+ var _a, _b;
77721
78012
  const ret = new chunk_1.Chunk();
77722
78013
  const selectStatement = node.findFirstStatement(abaplint.Statements.SelectLoop);
77723
78014
  if (selectStatement === undefined) {
@@ -77731,11 +78022,19 @@ class SelectTranspiler {
77731
78022
  const loopName = unique_identifier_1.UniqueIdentifier.get();
77732
78023
  ret.appendString(`let ${targetName} = new abap.types.Table(abap.DDIC["${from}"].type);\n`);
77733
78024
  ret.appendChunk(new select_1.SelectTranspiler().transpile(selectStatement, traversal, targetName));
77734
- ret.appendString(`\nfor (const ${loopName} of ${targetName}.array()) {\n`);
77735
- if (concat.includes(" INTO CORRESPONDING FIELDS OF ")) {
78025
+ const packageSize = (_b = node.findFirstExpression(abaplint.Expressions.SelectLoop)) === null || _b === void 0 ? void 0 : _b.findExpressionAfterToken("SIZE");
78026
+ if (packageSize) {
78027
+ const getSize = new expressions_1.SQLSourceTranspiler().transpile(packageSize, traversal).getCode() + ".get()";
78028
+ ret.appendString(`if (${targetName}.array().length > ${getSize}) { throw new Error("PACKAGE SIZED loop larger than package size not supported"); };\n`);
78029
+ ret.appendString(`abap.statements.append({source: ${targetName}, target: ${intoName}, lines: true});\n`);
78030
+ ret.appendString(`{\n`);
78031
+ }
78032
+ else if (concat.includes(" INTO CORRESPONDING FIELDS OF ")) {
78033
+ ret.appendString(`\nfor (const ${loopName} of ${targetName}.array()) {\n`);
77736
78034
  ret.appendString(`abap.statements.moveCorresponding(${loopName}, ${intoName});\n`);
77737
78035
  }
77738
78036
  else {
78037
+ ret.appendString(`\nfor (const ${loopName} of ${targetName}.array()) {\n`);
77739
78038
  ret.appendString(`${intoName}.set(${loopName});\n`);
77740
78039
  }
77741
78040
  const body = node.findDirectStructure(abaplint.Structures.Body);
@@ -78925,13 +79224,11 @@ async function run() {
78925
79224
  }
78926
79225
  }
78927
79226
  ret += `// -------------------END-------------------
78928
- console.log(abap.console.get());
78929
79227
  fs.writeFileSync(__dirname + path.sep + "_output.xml", unit.xUnitXML());
78930
79228
  } catch (e) {
78931
79229
  if (meth) {
78932
79230
  meth.fail();
78933
79231
  }
78934
- console.log(abap.console.get());
78935
79232
  fs.writeFileSync(__dirname + path.sep + "_output.xml", unit.xUnitXML());
78936
79233
  throw e;
78937
79234
  }
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "@abaplint/transpiler-cli",
3
- "version": "2.6.43",
3
+ "version": "2.7.0",
4
4
  "description": "Transpiler - Command Line Interface",
5
+ "funding": "https://github.com/sponsors/larshp",
5
6
  "bin": {
6
7
  "abap_transpile": "./abap_transpile"
7
8
  },
@@ -25,15 +26,15 @@
25
26
  "author": "abaplint",
26
27
  "license": "MIT",
27
28
  "devDependencies": {
28
- "@abaplint/transpiler": "^2.6.43",
29
+ "@abaplint/transpiler": "^2.7.0",
29
30
  "@types/glob": "^7.2.0",
30
31
  "glob": "=7.2.0",
31
32
  "@types/progress": "^2.0.5",
32
- "@types/node": "^20.1.0",
33
- "@abaplint/core": "^2.99.7",
33
+ "@types/node": "^20.1.4",
34
+ "@abaplint/core": "^2.100.2",
34
35
  "progress": "^2.0.3",
35
- "webpack": "^5.82.0",
36
- "webpack-cli": "^5.1.0",
36
+ "webpack": "^5.82.1",
37
+ "webpack-cli": "^5.1.1",
37
38
  "typescript": "^5.0.4"
38
39
  }
39
40
  }