yukigo 0.2.3 → 0.3.2

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 (266) hide show
  1. package/.mocharc.json +3 -3
  2. package/CHANGELOG.md +105 -40
  3. package/README.md +193 -193
  4. package/dist/analyzer/GraphBuilder.d.ts +1 -0
  5. package/dist/analyzer/GraphBuilder.js +2 -1
  6. package/dist/analyzer/index.d.ts +0 -7
  7. package/dist/analyzer/index.js +3 -3
  8. package/dist/analyzer/inspections/functional/functional.d.ts +1 -1
  9. package/dist/analyzer/inspections/functional/functional.js +1 -1
  10. package/dist/analyzer/inspections/functional/smells.d.ts +3 -3
  11. package/dist/analyzer/inspections/functional/smells.js +27 -35
  12. package/dist/analyzer/inspections/generic/generic.d.ts +22 -14
  13. package/dist/analyzer/inspections/generic/generic.js +82 -60
  14. package/dist/analyzer/inspections/generic/smells.d.ts +2 -0
  15. package/dist/analyzer/inspections/generic/smells.js +55 -64
  16. package/dist/analyzer/inspections/imperative/imperative.d.ts +3 -3
  17. package/dist/analyzer/inspections/imperative/imperative.js +3 -3
  18. package/dist/analyzer/inspections/imperative/smells.d.ts +1 -0
  19. package/dist/analyzer/inspections/imperative/smells.js +8 -5
  20. package/dist/analyzer/inspections/logic/logic.d.ts +8 -8
  21. package/dist/analyzer/inspections/logic/logic.js +5 -5
  22. package/dist/analyzer/inspections/logic/smells.js +2 -2
  23. package/dist/analyzer/inspections/object/object.d.ts +5 -5
  24. package/dist/analyzer/inspections/object/object.js +22 -21
  25. package/dist/analyzer/inspections/object/smells.js +11 -23
  26. package/dist/analyzer/utils.d.ts +6 -2
  27. package/dist/analyzer/utils.js +6 -2
  28. package/dist/interpreter/components/EnvBuilder.d.ts +20 -1
  29. package/dist/interpreter/components/EnvBuilder.js +211 -66
  30. package/dist/interpreter/components/EqualityComparer.d.ts +15 -0
  31. package/dist/interpreter/components/EqualityComparer.js +69 -0
  32. package/dist/interpreter/components/Operations.d.ts +17 -14
  33. package/dist/interpreter/components/Operations.js +61 -62
  34. package/dist/interpreter/components/PatternMatcher.d.ts +19 -58
  35. package/dist/interpreter/components/PatternMatcher.js +185 -286
  36. package/dist/interpreter/components/RuntimeContext.d.ts +24 -15
  37. package/dist/interpreter/components/RuntimeContext.js +43 -4
  38. package/dist/interpreter/components/TestRunner.d.ts +15 -13
  39. package/dist/interpreter/components/TestRunner.js +86 -53
  40. package/dist/interpreter/components/evaluators/BaseEvaluator.d.ts +19 -0
  41. package/dist/interpreter/components/evaluators/BaseEvaluator.js +20 -0
  42. package/dist/interpreter/components/evaluators/ExpressionEvaluator.d.ts +34 -0
  43. package/dist/interpreter/components/evaluators/ExpressionEvaluator.js +298 -0
  44. package/dist/interpreter/components/evaluators/OperationEvaluator.d.ts +25 -0
  45. package/dist/interpreter/components/evaluators/OperationEvaluator.js +226 -0
  46. package/dist/interpreter/components/evaluators/PrimitiveEvaluator.d.ts +19 -0
  47. package/dist/interpreter/components/evaluators/PrimitiveEvaluator.js +50 -0
  48. package/dist/interpreter/components/evaluators/StatementEvaluator.d.ts +28 -0
  49. package/dist/interpreter/components/evaluators/StatementEvaluator.js +240 -0
  50. package/dist/interpreter/components/evaluators/TestingEvaluator.d.ts +15 -0
  51. package/dist/interpreter/components/evaluators/TestingEvaluator.js +14 -0
  52. package/dist/interpreter/components/evaluators/index.d.ts +110 -0
  53. package/dist/interpreter/components/evaluators/index.js +21 -0
  54. package/dist/interpreter/components/evaluators/utils.d.ts +7 -0
  55. package/dist/interpreter/components/evaluators/utils.js +50 -0
  56. package/dist/interpreter/components/hooks/YukigoHook.d.ts +27 -0
  57. package/dist/interpreter/components/hooks/YukigoHook.js +1 -0
  58. package/dist/interpreter/components/kernel/commands.d.ts +122 -0
  59. package/dist/interpreter/components/kernel/commands.js +203 -0
  60. package/dist/interpreter/components/kernel/index.d.ts +51 -0
  61. package/dist/interpreter/components/kernel/index.js +176 -0
  62. package/dist/interpreter/components/logic/LogicEngine.d.ts +26 -23
  63. package/dist/interpreter/components/logic/LogicEngine.js +234 -221
  64. package/dist/interpreter/components/logic/LogicResolver.d.ts +22 -51
  65. package/dist/interpreter/components/logic/LogicResolver.js +73 -440
  66. package/dist/interpreter/components/logic/LogicTerm.d.ts +104 -0
  67. package/dist/interpreter/components/logic/LogicTerm.js +423 -0
  68. package/dist/interpreter/components/logic/LogicTranslator.d.ts +25 -9
  69. package/dist/interpreter/components/logic/LogicTranslator.js +211 -74
  70. package/dist/interpreter/components/runtimes/FunctionRuntime.d.ts +6 -4
  71. package/dist/interpreter/components/runtimes/FunctionRuntime.js +82 -84
  72. package/dist/interpreter/components/runtimes/LazyRuntime.d.ts +13 -14
  73. package/dist/interpreter/components/runtimes/LazyRuntime.js +112 -239
  74. package/dist/interpreter/components/runtimes/ObjectRuntime.d.ts +17 -14
  75. package/dist/interpreter/components/runtimes/ObjectRuntime.js +105 -74
  76. package/dist/interpreter/errors.d.ts +10 -0
  77. package/dist/interpreter/errors.js +17 -0
  78. package/dist/interpreter/index.d.ts +9 -5
  79. package/dist/interpreter/index.js +11 -13
  80. package/dist/interpreter/primitives/YuValue.d.ts +21 -0
  81. package/dist/interpreter/primitives/YuValue.js +40 -0
  82. package/dist/interpreter/primitives/capabilities.d.ts +90 -0
  83. package/dist/interpreter/primitives/capabilities.js +1 -0
  84. package/dist/interpreter/primitives/entities/LazyList.d.ts +48 -0
  85. package/dist/interpreter/primitives/entities/LazyList.js +164 -0
  86. package/dist/interpreter/primitives/entities/LogicResult.d.ts +51 -0
  87. package/dist/interpreter/primitives/entities/LogicResult.js +101 -0
  88. package/dist/interpreter/primitives/entities/RuntimeClass.d.ts +24 -0
  89. package/dist/interpreter/primitives/entities/RuntimeClass.js +57 -0
  90. package/dist/interpreter/primitives/entities/RuntimeFunction.d.ts +40 -0
  91. package/dist/interpreter/primitives/entities/RuntimeFunction.js +73 -0
  92. package/dist/interpreter/primitives/entities/RuntimeObject.d.ts +27 -0
  93. package/dist/interpreter/primitives/entities/RuntimeObject.js +82 -0
  94. package/dist/interpreter/primitives/entities/RuntimePredicate.d.ts +19 -0
  95. package/dist/interpreter/primitives/entities/RuntimePredicate.js +59 -0
  96. package/dist/interpreter/primitives/index.d.ts +14 -0
  97. package/dist/interpreter/primitives/index.js +14 -0
  98. package/dist/interpreter/primitives/scalars/YuBoolean.d.ts +24 -0
  99. package/dist/interpreter/primitives/scalars/YuBoolean.js +69 -0
  100. package/dist/interpreter/primitives/scalars/YuChar.d.ts +28 -0
  101. package/dist/interpreter/primitives/scalars/YuChar.js +78 -0
  102. package/dist/interpreter/primitives/scalars/YuNil.d.ts +25 -0
  103. package/dist/interpreter/primitives/scalars/YuNil.js +73 -0
  104. package/dist/interpreter/primitives/scalars/YuNumber.d.ts +49 -0
  105. package/dist/interpreter/primitives/scalars/YuNumber.js +165 -0
  106. package/dist/interpreter/primitives/sequences/YuArray.d.ts +33 -0
  107. package/dist/interpreter/primitives/sequences/YuArray.js +150 -0
  108. package/dist/interpreter/primitives/sequences/YuString.d.ts +40 -0
  109. package/dist/interpreter/primitives/sequences/YuString.js +130 -0
  110. package/dist/interpreter/utils.d.ts +23 -10
  111. package/dist/interpreter/utils.js +25 -30
  112. package/dist/tester/index.d.ts +3 -3
  113. package/dist/tester/index.js +39 -28
  114. package/dist/utils/helpers.d.ts +13 -5
  115. package/dist/utils/helpers.js +38 -85
  116. package/package.json +3 -16
  117. package/src/analyzer/GraphBuilder.ts +143 -142
  118. package/src/analyzer/index.ts +185 -194
  119. package/src/analyzer/inspections/functional/functional.ts +121 -121
  120. package/src/analyzer/inspections/functional/smells.ts +88 -102
  121. package/src/analyzer/inspections/generic/generic.ts +610 -577
  122. package/src/analyzer/inspections/generic/smells.ts +355 -365
  123. package/src/analyzer/inspections/imperative/imperative.ts +104 -101
  124. package/src/analyzer/inspections/imperative/smells.ts +58 -54
  125. package/src/analyzer/inspections/logic/logic.ts +84 -90
  126. package/src/analyzer/inspections/logic/smells.ts +54 -54
  127. package/src/analyzer/inspections/object/object.ts +295 -264
  128. package/src/analyzer/inspections/object/smells.ts +130 -144
  129. package/src/analyzer/utils.ts +115 -109
  130. package/src/index.ts +3 -3
  131. package/src/interpreter/components/EnvBuilder.ts +405 -202
  132. package/src/interpreter/components/EqualityComparer.ts +107 -0
  133. package/src/interpreter/components/Operations.ts +126 -99
  134. package/src/interpreter/components/PatternMatcher.ts +375 -475
  135. package/src/interpreter/components/RuntimeContext.ts +181 -119
  136. package/src/interpreter/components/TestRunner.ts +223 -151
  137. package/src/interpreter/components/evaluators/BaseEvaluator.ts +36 -0
  138. package/src/interpreter/components/evaluators/ExpressionEvaluator.ts +475 -0
  139. package/src/interpreter/components/evaluators/OperationEvaluator.ts +477 -0
  140. package/src/interpreter/components/evaluators/PrimitiveEvaluator.ts +80 -0
  141. package/src/interpreter/components/evaluators/StatementEvaluator.ts +372 -0
  142. package/src/interpreter/components/evaluators/TestingEvaluator.ts +26 -0
  143. package/src/interpreter/components/evaluators/index.ts +34 -0
  144. package/src/interpreter/components/evaluators/utils.ts +64 -0
  145. package/src/interpreter/components/hooks/YukigoHook.ts +45 -0
  146. package/src/interpreter/components/kernel/commands.ts +255 -0
  147. package/src/interpreter/components/kernel/index.ts +222 -0
  148. package/src/interpreter/components/logic/LogicEngine.ts +509 -519
  149. package/src/interpreter/components/logic/LogicResolver.ts +209 -858
  150. package/src/interpreter/components/logic/LogicTerm.ts +477 -0
  151. package/src/interpreter/components/logic/LogicTranslator.ts +362 -149
  152. package/src/interpreter/components/runtimes/FunctionRuntime.ts +249 -227
  153. package/src/interpreter/components/runtimes/LazyRuntime.ts +226 -334
  154. package/src/interpreter/components/runtimes/ObjectRuntime.ts +262 -224
  155. package/src/interpreter/errors.ts +68 -47
  156. package/src/interpreter/index.ts +50 -52
  157. package/src/interpreter/primitives/YuValue.ts +64 -0
  158. package/src/interpreter/primitives/capabilities.ts +111 -0
  159. package/src/interpreter/primitives/entities/LazyList.ts +225 -0
  160. package/src/interpreter/primitives/entities/LogicResult.ts +133 -0
  161. package/src/interpreter/primitives/entities/RuntimeClass.ts +70 -0
  162. package/src/interpreter/primitives/entities/RuntimeFunction.ts +108 -0
  163. package/src/interpreter/primitives/entities/RuntimeObject.ts +110 -0
  164. package/src/interpreter/primitives/entities/RuntimePredicate.ts +77 -0
  165. package/src/interpreter/primitives/index.ts +17 -0
  166. package/src/interpreter/primitives/scalars/YuBoolean.ts +79 -0
  167. package/src/interpreter/primitives/scalars/YuChar.ts +94 -0
  168. package/src/interpreter/primitives/scalars/YuNil.ts +84 -0
  169. package/src/interpreter/primitives/scalars/YuNumber.ts +187 -0
  170. package/src/interpreter/primitives/sequences/YuArray.ts +178 -0
  171. package/src/interpreter/primitives/sequences/YuString.ts +165 -0
  172. package/src/interpreter/utils.ts +105 -84
  173. package/src/tester/index.ts +157 -128
  174. package/src/utils/helpers.ts +113 -169
  175. package/tests/analyzer/functional.spec.ts +221 -207
  176. package/tests/analyzer/generic.spec.ts +178 -178
  177. package/tests/analyzer/helpers.spec.ts +83 -89
  178. package/tests/analyzer/logic.spec.ts +237 -237
  179. package/tests/analyzer/oop.spec.ts +320 -323
  180. package/tests/analyzer/transitive.spec.ts +166 -166
  181. package/tests/interpreter/EnvBuilder.spec.ts +181 -183
  182. package/tests/interpreter/FunctionRuntime.spec.ts +224 -223
  183. package/tests/interpreter/LazyRuntime.spec.ts +227 -225
  184. package/tests/interpreter/LogicEngine.spec.ts +371 -327
  185. package/tests/interpreter/LogicSubstitution.spec.ts +90 -80
  186. package/tests/interpreter/ObjectRuntime.spec.ts +431 -606
  187. package/tests/interpreter/Operations.spec.ts +312 -220
  188. package/tests/interpreter/PatternSystem.spec.ts +254 -213
  189. package/tests/interpreter/Tests.spec.ts +122 -122
  190. package/tests/interpreter/interpreter.spec.ts +1143 -991
  191. package/tests/kernel/YukigoKernel.spec.ts +112 -0
  192. package/tests/tester/Tester.spec.ts +156 -152
  193. package/tsconfig.build.json +16 -15
  194. package/tsconfig.json +27 -25
  195. package/dist/interpreter/components/Visitor.d.ts +0 -70
  196. package/dist/interpreter/components/Visitor.js +0 -634
  197. package/dist/interpreter/entities.d.ts +0 -105
  198. package/dist/interpreter/entities.js +0 -96
  199. package/dist/interpreter/trampoline.d.ts +0 -17
  200. package/dist/interpreter/trampoline.js +0 -38
  201. package/dist/src/analyzer/GraphBuilder.d.ts +0 -30
  202. package/dist/src/analyzer/GraphBuilder.js +0 -100
  203. package/dist/src/analyzer/index.d.ts +0 -59
  204. package/dist/src/analyzer/index.js +0 -152
  205. package/dist/src/analyzer/inspections/functional/functional.d.ts +0 -44
  206. package/dist/src/analyzer/inspections/functional/functional.js +0 -149
  207. package/dist/src/analyzer/inspections/functional/smells.d.ts +0 -16
  208. package/dist/src/analyzer/inspections/functional/smells.js +0 -98
  209. package/dist/src/analyzer/inspections/generic/generic.d.ts +0 -178
  210. package/dist/src/analyzer/inspections/generic/generic.js +0 -604
  211. package/dist/src/analyzer/inspections/generic/smells.d.ts +0 -61
  212. package/dist/src/analyzer/inspections/generic/smells.js +0 -349
  213. package/dist/src/analyzer/inspections/imperative/imperative.d.ts +0 -35
  214. package/dist/src/analyzer/inspections/imperative/imperative.js +0 -109
  215. package/dist/src/analyzer/inspections/imperative/smells.d.ts +0 -16
  216. package/dist/src/analyzer/inspections/imperative/smells.js +0 -58
  217. package/dist/src/analyzer/inspections/logic/logic.d.ts +0 -32
  218. package/dist/src/analyzer/inspections/logic/logic.js +0 -96
  219. package/dist/src/analyzer/inspections/logic/smells.d.ts +0 -15
  220. package/dist/src/analyzer/inspections/logic/smells.js +0 -60
  221. package/dist/src/analyzer/inspections/object/object.d.ts +0 -90
  222. package/dist/src/analyzer/inspections/object/object.js +0 -321
  223. package/dist/src/analyzer/inspections/object/smells.d.ts +0 -30
  224. package/dist/src/analyzer/inspections/object/smells.js +0 -135
  225. package/dist/src/analyzer/utils.d.ts +0 -30
  226. package/dist/src/analyzer/utils.js +0 -78
  227. package/dist/src/index.d.ts +0 -4
  228. package/dist/src/index.js +0 -4
  229. package/dist/src/interpreter/components/EnvBuilder.d.ts +0 -21
  230. package/dist/src/interpreter/components/EnvBuilder.js +0 -155
  231. package/dist/src/interpreter/components/Operations.d.ts +0 -14
  232. package/dist/src/interpreter/components/Operations.js +0 -84
  233. package/dist/src/interpreter/components/PatternMatcher.d.ts +0 -73
  234. package/dist/src/interpreter/components/PatternMatcher.js +0 -358
  235. package/dist/src/interpreter/components/RuntimeContext.d.ts +0 -35
  236. package/dist/src/interpreter/components/RuntimeContext.js +0 -93
  237. package/dist/src/interpreter/components/TestRunner.d.ts +0 -19
  238. package/dist/src/interpreter/components/TestRunner.js +0 -110
  239. package/dist/src/interpreter/components/Visitor.d.ts +0 -71
  240. package/dist/src/interpreter/components/Visitor.js +0 -638
  241. package/dist/src/interpreter/components/logic/LogicEngine.d.ts +0 -29
  242. package/dist/src/interpreter/components/logic/LogicEngine.js +0 -259
  243. package/dist/src/interpreter/components/logic/LogicResolver.d.ts +0 -53
  244. package/dist/src/interpreter/components/logic/LogicResolver.js +0 -484
  245. package/dist/src/interpreter/components/logic/LogicTranslator.d.ts +0 -14
  246. package/dist/src/interpreter/components/logic/LogicTranslator.js +0 -99
  247. package/dist/src/interpreter/components/runtimes/FunctionRuntime.d.ts +0 -12
  248. package/dist/src/interpreter/components/runtimes/FunctionRuntime.js +0 -149
  249. package/dist/src/interpreter/components/runtimes/LazyRuntime.d.ts +0 -19
  250. package/dist/src/interpreter/components/runtimes/LazyRuntime.js +0 -269
  251. package/dist/src/interpreter/components/runtimes/ObjectRuntime.d.ts +0 -35
  252. package/dist/src/interpreter/components/runtimes/ObjectRuntime.js +0 -126
  253. package/dist/src/interpreter/errors.d.ts +0 -19
  254. package/dist/src/interpreter/errors.js +0 -36
  255. package/dist/src/interpreter/index.d.ts +0 -24
  256. package/dist/src/interpreter/index.js +0 -41
  257. package/dist/src/interpreter/trampoline.d.ts +0 -17
  258. package/dist/src/interpreter/trampoline.js +0 -38
  259. package/dist/src/interpreter/utils.d.ts +0 -11
  260. package/dist/src/interpreter/utils.js +0 -65
  261. package/dist/src/tester/index.d.ts +0 -25
  262. package/dist/src/tester/index.js +0 -113
  263. package/dist/src/utils/helpers.d.ts +0 -13
  264. package/dist/src/utils/helpers.js +0 -52
  265. package/src/interpreter/components/Visitor.ts +0 -1065
  266. package/src/interpreter/trampoline.ts +0 -71
@@ -1,264 +1,295 @@
1
- import {
2
- Attribute,
3
- Class,
4
- Interface,
5
- Method,
6
- New,
7
- Object,
8
- PrimitiveMethod,
9
- Self,
10
- Send,
11
- StopTraversalException,
12
- SymbolPrimitive,
13
- TraverseVisitor,
14
- } from "yukigo-ast";
15
- import { AutoScoped, ScopedVisitor, VisitorConstructor } from "../../utils.js";
16
- @AutoScoped
17
- export class DeclaresAttribute extends ScopedVisitor {
18
- constructor(private attributeName: string, scope?: string) {
19
- super(scope);
20
- }
21
- visitAttribute(node: Attribute): void {
22
- if (node.identifier.value === this.attributeName)
23
- throw new StopTraversalException();
24
- }
25
- }
26
- @AutoScoped
27
- export class DeclaresClass extends ScopedVisitor {
28
- constructor(private className: string, scope?: string) {
29
- super(scope);
30
- }
31
- visitClass(node: Class): void {
32
- if (node.identifier.value === this.className)
33
- throw new StopTraversalException();
34
- }
35
- }
36
-
37
- export class DeclaresInterface extends TraverseVisitor {
38
- constructor(private interfaceName: string) {
39
- super();
40
- }
41
- visitInterface(node: Interface): void {
42
- if (node.identifier.value === this.interfaceName)
43
- throw new StopTraversalException();
44
- }
45
- }
46
- @AutoScoped
47
- export class DeclaresMethod extends ScopedVisitor {
48
- constructor(private methodName: string, scope?: string) {
49
- super(scope);
50
- }
51
- visitMethod(node: Method): void {
52
- if (node.identifier.value === this.methodName)
53
- throw new StopTraversalException();
54
- }
55
- }
56
-
57
- export class DeclaresObject extends TraverseVisitor {
58
- constructor(private objectName: string) {
59
- super();
60
- }
61
- visitObject(node: Object): void {
62
- if (node.identifier.value === this.objectName)
63
- throw new StopTraversalException();
64
- }
65
- }
66
- @AutoScoped
67
- export class DeclaresPrimitive extends ScopedVisitor {
68
- constructor(private operatorName: string, scope?: string) {
69
- super(scope);
70
- }
71
- visitPrimitiveMethod(node: PrimitiveMethod): void {
72
- if (node.operator === this.operatorName) throw new StopTraversalException();
73
- }
74
- }
75
- @AutoScoped
76
- export class DeclaresSuperclass extends ScopedVisitor {
77
- constructor(private superclassName: string, scope?: string) {
78
- super(scope);
79
- }
80
- visitClass(node: Class): void {
81
- if (node.extendsSymbol && node.extendsSymbol.value === this.superclassName)
82
- throw new StopTraversalException();
83
- }
84
- }
85
- @AutoScoped
86
- export class Implements extends ScopedVisitor {
87
- constructor(private interfaceName: string, scope?: string) {
88
- super(scope);
89
- }
90
- visitClass(node: Class): void {
91
- if (
92
- node.implementsNode &&
93
- node.implementsNode.identifier.value === this.interfaceName
94
- )
95
- throw new StopTraversalException();
96
- }
97
- }
98
- @AutoScoped
99
- export class IncludeMixin extends ScopedVisitor {
100
- constructor(private mixinsName: string, scope?: string) {
101
- super(scope);
102
- }
103
- visitClass(node: Class): void {
104
- if (node.includes.some((sym) => sym.value === this.mixinsName))
105
- throw new StopTraversalException();
106
- }
107
- }
108
- @AutoScoped
109
- export class Instantiates extends ScopedVisitor {
110
- constructor(private className: string, scope?: string) {
111
- super(scope);
112
- }
113
- visitNew(node: New): void {
114
- if (node.identifier.value === this.className)
115
- throw new StopTraversalException();
116
- }
117
- }
118
- @AutoScoped
119
- export class UsesDynamicPolymorphism extends ScopedVisitor {
120
- private count = 0;
121
-
122
- constructor(private selectorName: string, scope?: string) {
123
- super(scope);
124
- }
125
-
126
- visitMethod(node: Method): void {
127
- if (node.identifier.value === this.selectorName) {
128
- this.count++;
129
- if (this.count >= 2) throw new StopTraversalException();
130
- }
131
- }
132
- }
133
- @AutoScoped
134
- export class UsesInheritance extends ScopedVisitor {
135
- constructor(scope?: string) {
136
- super(scope);
137
- }
138
- visitClass(node: Class): void {
139
- if (node.extendsSymbol) throw new StopTraversalException();
140
- }
141
- visitInterface(node: Interface): void {
142
- if (node.extendsSymbol && node.extendsSymbol.length > 0)
143
- throw new StopTraversalException();
144
- }
145
- }
146
- @AutoScoped
147
- export class UsesMixins extends ScopedVisitor {
148
- constructor(scope?: string) {
149
- super(scope);
150
- }
151
- visitClass(node: Class): void {
152
- if (node.includes.length > 0) throw new StopTraversalException();
153
- }
154
- }
155
- @AutoScoped
156
- export class UsesObjectComposition extends ScopedVisitor {
157
- constructor(scope?: string) {
158
- super(scope);
159
- }
160
- visitAttribute(node: Attribute): void {
161
- if (node.expression instanceof New) throw new StopTraversalException();
162
- }
163
- }
164
-
165
- export class UsesStaticMethodOverload extends TraverseVisitor {
166
- private scopes: Set<string>[] = [];
167
- visitClass(node: Class): void {
168
- this.scopes.push(new Set());
169
- node.expression.accept(this);
170
- this.scopes.pop();
171
- }
172
- visitObject(node: Object): void {
173
- this.scopes.push(new Set());
174
- node.expression.accept(this);
175
- this.scopes.pop();
176
- }
177
-
178
- visitMethod(node: Method): void {
179
- const currentScope = this.scopes[0];
180
- const methodName = node.identifier.value;
181
-
182
- if (currentScope.has(methodName)) throw new StopTraversalException();
183
- currentScope.add(methodName);
184
- }
185
- }
186
- @AutoScoped
187
- export class UsesDynamicMethodOverload extends ScopedVisitor {
188
- constructor(scope?: string) {
189
- super(scope);
190
- }
191
-
192
- visitMethod(node: Method): void {
193
- if (node.equations.length > 1) throw new StopTraversalException();
194
- }
195
- }
196
- @AutoScoped
197
- class AbstractMethodCollector extends ScopedVisitor {
198
- public abstractMethods: Set<string> = new Set();
199
- constructor(scope?: string) {
200
- super(scope);
201
- }
202
- visitMethod(node: Method): void {
203
- if (node.getMetadata<boolean>("isAbstract") === true)
204
- this.abstractMethods.add(node.identifier.value);
205
- }
206
- // stop propagation to not mix scopes
207
- visitClass(node: Class) {
208
- return;
209
- }
210
- visitObject(node: Object) {
211
- return;
212
- }
213
- }
214
- @AutoScoped
215
- export class UsesTemplateMethod extends ScopedVisitor {
216
- private abstractMethodsStack: Set<string>[] = [];
217
- constructor(scope?: string) {
218
- super(scope);
219
- }
220
- visitClass(node: Class): void {
221
- const collector = new AbstractMethodCollector(this.binding);
222
- if (node.expression) node.expression.accept(collector);
223
- this.abstractMethodsStack.push(collector.abstractMethods);
224
- node.expression.accept(this);
225
- this.abstractMethodsStack.pop();
226
- }
227
-
228
- visitSend(node: Send): void {
229
- if (node.receiver instanceof Self) {
230
- if (this.abstractMethodsStack.length === 0) return;
231
- const currentAbstractMethods = this.abstractMethodsStack[0];
232
-
233
- // This doesnt match if message is complex expression
234
- if (!(node.selector instanceof SymbolPrimitive)) return;
235
- const selectorName = node.selector.value;
236
-
237
- const isMessageAbstract = currentAbstractMethods.has(selectorName);
238
-
239
- if (isMessageAbstract) throw new StopTraversalException();
240
- }
241
- }
242
- }
243
-
244
- export const objectInspections: Record<string, VisitorConstructor> = {
245
- DeclaresAttribute: DeclaresAttribute,
246
- DeclaresClass: DeclaresClass,
247
- DeclaresInterface: DeclaresInterface,
248
- DeclaresMethod: DeclaresMethod,
249
- DeclaresObject: DeclaresObject,
250
- DeclaresPrimitive: DeclaresPrimitive,
251
- DeclaresSuperclass: DeclaresSuperclass,
252
- Implements: Implements,
253
- IncludeMixin: IncludeMixin,
254
- Inherits: DeclaresSuperclass, // alias for DeclaresSuperclass
255
- Instantiates: Instantiates,
256
- UsesDynamicPolymorphism: UsesDynamicPolymorphism,
257
- UsesInheritance: UsesInheritance,
258
- UsesMixins: UsesMixins,
259
- UsesObjectComposition: UsesObjectComposition,
260
- UsesStaticMethodOverload: UsesStaticMethodOverload,
261
- UsesDynamicMethodOverload: UsesDynamicMethodOverload,
262
- UsesTemplateMethod: UsesTemplateMethod,
263
- UsesStaticPolymorphism: UsesStaticMethodOverload, // alias for UsesStaticMethodOverload
264
- };
1
+ import {
2
+ ASTNode,
3
+ Attribute,
4
+ Class,
5
+ Interface,
6
+ Method,
7
+ New,
8
+ Object,
9
+ PrimitiveMethod,
10
+ Self,
11
+ Send,
12
+ StopTraversalException,
13
+ SymbolPrimitive,
14
+ } from "yukigo-ast";
15
+ import {
16
+ AutoScoped,
17
+ InspectionVisitor,
18
+ ScopedVisitor,
19
+ VisitorConstructor,
20
+ } from "../../utils.js";
21
+ @AutoScoped
22
+ export class DeclaresAttribute extends ScopedVisitor {
23
+ constructor(
24
+ private attributeName: string,
25
+ scope?: string,
26
+ ) {
27
+ super(scope);
28
+ }
29
+ visitAttribute(node: Attribute): void {
30
+ if (node.identifier.value === this.attributeName)
31
+ throw new StopTraversalException();
32
+ }
33
+ }
34
+ @AutoScoped
35
+ export class DeclaresClass extends ScopedVisitor {
36
+ constructor(
37
+ private className: string,
38
+ scope?: string,
39
+ ) {
40
+ super(scope);
41
+ }
42
+ visitClass(node: Class): void {
43
+ if (node.identifier.value === this.className)
44
+ throw new StopTraversalException();
45
+ }
46
+ }
47
+
48
+ export class DeclaresInterface extends InspectionVisitor {
49
+ constructor(private interfaceName: string) {
50
+ super();
51
+ }
52
+ visitInterface(node: Interface): void {
53
+ if (node.identifier.value === this.interfaceName)
54
+ throw new StopTraversalException();
55
+ }
56
+ }
57
+ @AutoScoped
58
+ export class DeclaresMethod extends ScopedVisitor {
59
+ constructor(
60
+ private methodName: string,
61
+ scope?: string,
62
+ ) {
63
+ super(scope);
64
+ }
65
+ visitMethod(node: Method): void {
66
+ if (node.identifier.value === this.methodName)
67
+ throw new StopTraversalException();
68
+ }
69
+ }
70
+
71
+ export class DeclaresObject extends InspectionVisitor {
72
+ constructor(private objectName: string) {
73
+ super();
74
+ }
75
+ visitObject(node: Object): void {
76
+ if (node.identifier.value === this.objectName)
77
+ throw new StopTraversalException();
78
+ }
79
+ }
80
+ @AutoScoped
81
+ export class DeclaresPrimitive extends ScopedVisitor {
82
+ constructor(
83
+ private operatorName: string,
84
+ scope?: string,
85
+ ) {
86
+ super(scope);
87
+ }
88
+ visitPrimitiveMethod(node: PrimitiveMethod): void {
89
+ if (node.operator === this.operatorName) throw new StopTraversalException();
90
+ }
91
+ }
92
+ @AutoScoped
93
+ export class DeclaresSuperclass extends ScopedVisitor {
94
+ constructor(
95
+ private superclassName: string,
96
+ scope?: string,
97
+ ) {
98
+ super(scope);
99
+ }
100
+ visitClass(node: Class): void {
101
+ if (node.extendsSymbol && node.extendsSymbol.value === this.superclassName)
102
+ throw new StopTraversalException();
103
+ }
104
+ }
105
+ @AutoScoped
106
+ export class Implements extends ScopedVisitor {
107
+ constructor(
108
+ private interfaceName: string,
109
+ scope?: string,
110
+ ) {
111
+ super(scope);
112
+ }
113
+ visitClass(node: Class): void {
114
+ const { implementsNode } = node;
115
+ if (
116
+ implementsNode &&
117
+ implementsNode.identifier.value === this.interfaceName
118
+ )
119
+ throw new StopTraversalException();
120
+ }
121
+ }
122
+ @AutoScoped
123
+ export class IncludeMixin extends ScopedVisitor {
124
+ constructor(
125
+ private mixinsName: string,
126
+ scope?: string,
127
+ ) {
128
+ super(scope);
129
+ }
130
+ visitClass(node: Class): void {
131
+ if (node.includes.some((sym) => sym.value === this.mixinsName))
132
+ throw new StopTraversalException();
133
+ }
134
+ }
135
+ @AutoScoped
136
+ export class Instantiates extends ScopedVisitor {
137
+ constructor(
138
+ private className: string,
139
+ scope?: string,
140
+ ) {
141
+ super(scope);
142
+ }
143
+ visitNew(node: New): void {
144
+ if (node.identifier.value === this.className)
145
+ throw new StopTraversalException();
146
+ }
147
+ }
148
+ @AutoScoped
149
+ export class UsesDynamicPolymorphism extends ScopedVisitor {
150
+ private count = 0;
151
+
152
+ constructor(
153
+ private selectorName: string,
154
+ scope?: string,
155
+ ) {
156
+ super(scope);
157
+ }
158
+
159
+ visitMethod(node: Method): void {
160
+ if (node.identifier.value === this.selectorName) {
161
+ this.count++;
162
+ if (this.count >= 2) throw new StopTraversalException();
163
+ }
164
+ }
165
+ }
166
+ @AutoScoped
167
+ export class UsesInheritance extends ScopedVisitor {
168
+ constructor(scope?: string) {
169
+ super(scope);
170
+ }
171
+ visitClass(node: Class): void {
172
+ if (node.extendsSymbol) throw new StopTraversalException();
173
+ }
174
+ visitInterface(node: Interface): void {
175
+ if (node.extendsSymbol && node.extendsSymbol.length > 0)
176
+ throw new StopTraversalException();
177
+ }
178
+ }
179
+ @AutoScoped
180
+ export class UsesMixins extends ScopedVisitor {
181
+ constructor(scope?: string) {
182
+ super(scope);
183
+ }
184
+ visitClass(node: Class): void {
185
+ if (node.includes.length > 0) throw new StopTraversalException();
186
+ }
187
+ }
188
+ @AutoScoped
189
+ export class UsesObjectComposition extends ScopedVisitor {
190
+ constructor(scope?: string) {
191
+ super(scope);
192
+ }
193
+ visitAttribute(node: Attribute): void {
194
+ if (node.expression.is(New)) throw new StopTraversalException();
195
+ }
196
+ }
197
+
198
+ export class UsesStaticMethodOverload extends InspectionVisitor {
199
+ private scopes: Set<string>[] = [];
200
+ visitClass(node: Class): void {
201
+ this.scopes.push(new Set());
202
+ node.expression.accept(this);
203
+ this.scopes.pop();
204
+ }
205
+ visitObject(node: Object): void {
206
+ this.scopes.push(new Set());
207
+ node.expression.accept(this);
208
+ this.scopes.pop();
209
+ }
210
+
211
+ visitMethod(node: Method): void {
212
+ const currentScope = this.scopes[0];
213
+ const methodName = node.identifier.value;
214
+
215
+ if (currentScope.has(methodName)) throw new StopTraversalException();
216
+ currentScope.add(methodName);
217
+ }
218
+ }
219
+ @AutoScoped
220
+ export class UsesDynamicMethodOverload extends ScopedVisitor {
221
+ constructor(scope?: string) {
222
+ super(scope);
223
+ }
224
+
225
+ visitMethod(node: Method): void {
226
+ if (node.equations.length > 1) throw new StopTraversalException();
227
+ }
228
+ }
229
+ @AutoScoped
230
+ class AbstractMethodCollector extends ScopedVisitor {
231
+ public abstractMethods: Set<string> = new Set();
232
+ constructor(scope?: string) {
233
+ super(scope);
234
+ }
235
+ visitMethod(node: Method): void {
236
+ if (node.isAbstract) this.abstractMethods.add(node.identifier.value);
237
+ }
238
+ // stop propagation to not mix scopes
239
+ visitClass(node: Class) {
240
+ return;
241
+ }
242
+ visitObject(node: Object) {
243
+ return;
244
+ }
245
+ }
246
+ @AutoScoped
247
+ export class UsesTemplateMethod extends ScopedVisitor {
248
+ private abstractMethodsStack: Set<string>[] = [];
249
+ constructor(scope?: string) {
250
+ super(scope);
251
+ }
252
+ visitClass(node: Class): void {
253
+ const collector = new AbstractMethodCollector(this.binding);
254
+ if (node.expression) node.expression.accept(collector);
255
+ this.abstractMethodsStack.push(collector.abstractMethods);
256
+ node.expression.accept(this);
257
+ this.abstractMethodsStack.pop();
258
+ }
259
+
260
+ visitSend(node: Send): void {
261
+ if (!node.receiver.is(Self)) return;
262
+ if (this.abstractMethodsStack.length === 0) return;
263
+ const currentAbstractMethods = this.abstractMethodsStack[0];
264
+
265
+ // This doesnt match if message is complex expression
266
+ if (!node.selector.is(SymbolPrimitive)) return;
267
+ const selectorName = node.selector.value;
268
+
269
+ const isMessageAbstract = currentAbstractMethods.has(selectorName);
270
+
271
+ if (isMessageAbstract) throw new StopTraversalException();
272
+ }
273
+ }
274
+
275
+ export const objectInspections: Record<string, VisitorConstructor> = {
276
+ DeclaresAttribute: DeclaresAttribute,
277
+ DeclaresClass: DeclaresClass,
278
+ DeclaresInterface: DeclaresInterface,
279
+ DeclaresMethod: DeclaresMethod,
280
+ DeclaresObject: DeclaresObject,
281
+ DeclaresPrimitive: DeclaresPrimitive,
282
+ DeclaresSuperclass: DeclaresSuperclass,
283
+ Implements: Implements,
284
+ IncludeMixin: IncludeMixin,
285
+ Inherits: DeclaresSuperclass, // alias for DeclaresSuperclass
286
+ Instantiates: Instantiates,
287
+ UsesDynamicPolymorphism: UsesDynamicPolymorphism,
288
+ UsesInheritance: UsesInheritance,
289
+ UsesMixins: UsesMixins,
290
+ UsesObjectComposition: UsesObjectComposition,
291
+ UsesStaticMethodOverload: UsesStaticMethodOverload,
292
+ UsesDynamicMethodOverload: UsesDynamicMethodOverload,
293
+ UsesTemplateMethod: UsesTemplateMethod,
294
+ UsesStaticPolymorphism: UsesStaticMethodOverload, // alias for UsesStaticMethodOverload
295
+ };