Skip to content

Commit cb0c6e6

Browse files
authored
Refine D2D with Grammar (.g/.g4) Class Mapping #1808 (#1942)
Signed-off-by: Chin Yeung Li <[email protected]>
1 parent f784e6c commit cb0c6e6

File tree

3 files changed

+59
-0
lines changed

3 files changed

+59
-0
lines changed

scanpipe/pipelines/deploy_to_develop.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ def steps(cls):
8080
cls.find_kotlin_packages,
8181
cls.map_kotlin_to_class,
8282
cls.map_jar_to_kotlin_source,
83+
cls.find_grammar_packages,
84+
cls.map_grammar_to_class,
85+
cls.map_jar_to_grammar_source,
8386
cls.map_javascript,
8487
cls.map_javascript_symbols,
8588
cls.map_javascript_strings,
@@ -235,6 +238,27 @@ def map_jar_to_kotlin_source(self):
235238
project=self.project, jvm_lang=jvm.KotlinLanguage, logger=self.log
236239
)
237240

241+
@optional_step("Grammar")
242+
def find_grammar_packages(self):
243+
"""Find the java package of the .g/.g4 source files."""
244+
d2d.find_jvm_packages(
245+
project=self.project, jvm_lang=jvm.GrammarLanguage, logger=self.log
246+
)
247+
248+
@optional_step("Grammar")
249+
def map_grammar_to_class(self):
250+
"""Map a .class compiled file to its .g/.g4 source."""
251+
d2d.map_jvm_to_class(
252+
project=self.project, jvm_lang=jvm.GrammarLanguage, logger=self.log
253+
)
254+
255+
@optional_step("Grammar")
256+
def map_jar_to_grammar_source(self):
257+
"""Map .jar files to their related source directory."""
258+
d2d.map_jar_to_jvm_source(
259+
project=self.project, jvm_lang=jvm.GrammarLanguage, logger=self.log
260+
)
261+
238262
@optional_step("JavaScript")
239263
def map_javascript(self):
240264
"""

scanpipe/pipes/jvm.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,15 @@ def get_normalized_path(cls, path, extension):
208208
return str(path.parent / f"{class_name}{extension}")
209209

210210

211+
class GrammarLanguage(JvmLanguage):
212+
name = "grammar"
213+
source_extensions = (".g", ".g4")
214+
binary_extensions = (".class",)
215+
source_package_attribute_name = "grammar_package"
216+
package_regex = re.compile(r"^\s*package\s+([\w\.]+)\s*;?")
217+
binary_map_type = "grammar_to_class"
218+
219+
211220
def get_fully_qualified_path(jvm_package, filename):
212221
"""
213222
Return a fully qualified path of a ``filename`` in a

scanpipe/tests/pipes/test_d2d.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,32 @@ def test_scanpipe_pipes_d2d_map_java_to_class_with_java_in_deploy(self):
435435
expected = "Mapping 1 .class resources to 1 ('.java',)"
436436
self.assertIn(expected, buffer.getvalue())
437437

438+
def test_scanpipe_pipes_d2d_map_grammar_to_class(self):
439+
from1 = make_resource_file(
440+
self.project1,
441+
path="from/antlr4-4.5.1-beta-1/tool/src/org/antlr/v4/parse/BlockSetTransformer.g",
442+
extra_data={"grammar_package": "org.antlr.v4.parse"},
443+
)
444+
445+
to1 = make_resource_file(
446+
self.project1,
447+
path="to/org/antlr/v4/parse/BlockSetTransformer.class",
448+
)
449+
450+
buffer = io.StringIO()
451+
d2d.map_jvm_to_class(
452+
self.project1, logger=buffer.write, jvm_lang=jvm.GrammarLanguage
453+
)
454+
455+
expected = "Mapping 1 .class resources to 1 ('.g', '.g4')"
456+
self.assertIn(expected, buffer.getvalue())
457+
self.assertEqual(1, self.project1.codebaserelations.count())
458+
459+
r1 = self.project1.codebaserelations.get(to_resource=to1, from_resource=from1)
460+
self.assertEqual("grammar_to_class", r1.map_type)
461+
expected = {"from_source_root": "from/antlr4-4.5.1-beta-1/tool/src/"}
462+
self.assertEqual(expected, r1.extra_data)
463+
438464
def test_scanpipe_pipes_d2d_map_java_to_class_no_java(self):
439465
make_resource_file(self.project1, path="to/Abstract.class")
440466
buffer = io.StringIO()

0 commit comments

Comments
 (0)