diff --git a/gitnexus/package-lock.json b/gitnexus/package-lock.json index 3736d0c46..9abd15b0e 100644 --- a/gitnexus/package-lock.json +++ b/gitnexus/package-lock.json @@ -17,7 +17,6 @@ "commander": "^12.0.0", "cors": "^2.8.5", "express": "^4.19.2", - "gitnexus-shared": "file:../gitnexus-shared", "glob": "^11.0.0", "graphology": "^0.25.4", "graphology-indices": "^0.17.0", diff --git a/gitnexus/test/fixtures/lang-resolution/java-child-extends-parent/src/models/Child.java b/gitnexus/test/fixtures/lang-resolution/java-child-extends-parent/src/models/Child.java new file mode 100644 index 000000000..624f4edbc --- /dev/null +++ b/gitnexus/test/fixtures/lang-resolution/java-child-extends-parent/src/models/Child.java @@ -0,0 +1,5 @@ +package models; + +public class Child extends Parent { + public void childOnly() {} +} diff --git a/gitnexus/test/fixtures/lang-resolution/java-child-extends-parent/src/models/Parent.java b/gitnexus/test/fixtures/lang-resolution/java-child-extends-parent/src/models/Parent.java new file mode 100644 index 000000000..cd31f52f9 --- /dev/null +++ b/gitnexus/test/fixtures/lang-resolution/java-child-extends-parent/src/models/Parent.java @@ -0,0 +1,5 @@ +package models; + +public class Parent { + public String parentMethod() { return "hello"; } +} diff --git a/gitnexus/test/fixtures/lang-resolution/java-child-extends-parent/src/services/App.java b/gitnexus/test/fixtures/lang-resolution/java-child-extends-parent/src/services/App.java new file mode 100644 index 000000000..703a30dc2 --- /dev/null +++ b/gitnexus/test/fixtures/lang-resolution/java-child-extends-parent/src/services/App.java @@ -0,0 +1,10 @@ +package services; + +import models.Child; + +public class App { + public void run() { + Child c = new Child(); + c.parentMethod(); + } +} diff --git a/gitnexus/test/integration/resolvers/java.test.ts b/gitnexus/test/integration/resolvers/java.test.ts index 7ce8453bf..a4ea94724 100644 --- a/gitnexus/test/integration/resolvers/java.test.ts +++ b/gitnexus/test/integration/resolvers/java.test.ts @@ -2098,3 +2098,38 @@ describe('Cross-class method chain resolution (Java) — #575', () => { expect(cityAccess.length).toBe(1); }); }); + +// --------------------------------------------------------------------------- +// SM-9: lookupMethodByOwnerWithMRO — class Child extends Parent +// child.parentMethod() resolves to Parent#parentMethod via MRO parent walk. +// --------------------------------------------------------------------------- + +describe('Java Child extends Parent — inherited method resolution (SM-9)', () => { + let result: PipelineResult; + + beforeAll(async () => { + result = await runPipelineFromRepo( + path.join(FIXTURES, 'java-child-extends-parent'), + () => {}, + ); + }, 60000); + + it('detects Parent and Child classes', () => { + const classes = getNodesByLabel(result, 'Class'); + expect(classes).toContain('Parent'); + expect(classes).toContain('Child'); + }); + + it('emits EXTENDS edge: Child → Parent', () => { + const extends_ = getRelationships(result, 'EXTENDS'); + expect(edgeSet(extends_)).toContain('Child → Parent'); + }); + + it('resolves c.parentMethod() to Parent#parentMethod via MRO walk', () => { + const calls = getRelationships(result, 'CALLS'); + const parentMethodCall = calls.find( + (c) => c.target === 'parentMethod' && c.targetFilePath.includes('Parent'), + ); + expect(parentMethodCall).toBeDefined(); + }); +});