TypeFox / yang-lsp

A Language Server for YANG
http://www.yang-central.org
Apache License 2.0
51 stars 13 forks source link

xpath serialization issue #224

Closed RimShao closed 2 years ago

RimShao commented 2 years ago

Hi,

Encounter xpath serialization issue as below, send the code to reproduce problem separately. Thanks.

Exception in thread "main" java.lang.RuntimeException: No EObjectDescription could be found in Scope XpathNameTest.ref for Submodule'test-policy-cncfw'.substatements[15]->Augment.substatements[1]->List'rtbh-policy'
Semantic Object: Submodule'test-ddos-cncfw'.substatements[20]->Augment.substatements[2]->Container'mitigation'.substatements[1]->Container'templates'.substatements[1]->List'remote-blackhole'.substatements[3]->Leaf'rtbh-policy-name'.substatements[1]->Type.substatements[0]->Path.reference->XpathLocation.target->XpathLocation.step->XpathStep.node->XpathNameTest
URI: file:src/main/java/testdata/test-ddos-cncfw.yang
EStructuralFeature: yang::XpathNameTest.ref
    at org.eclipse.xtext.serializer.diagnostic.ISerializationDiagnostic$ExceptionThrowingAcceptor.accept(ISerializationDiagnostic.java:132)
    at org.eclipse.xtext.serializer.tokens.CrossReferenceSerializer.getCrossReferenceNameFromScope(CrossReferenceSerializer.java:139)
    at io.typefox.yang.resource.YangCrossReferenceSerializer.getCrossReferenceNameFromScope(YangCrossReferenceSerializer.java:208)
    at io.typefox.yang.resource.YangCrossReferenceSerializer.serializeCrossRef(YangCrossReferenceSerializer.java:129)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.getToken(SequenceFeeder.java:483)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:246)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:452)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:512)
    at io.typefox.yang.serializer.YangSemanticSequencer.sequence_XpathNameTest(YangSemanticSequencer.java:2218)
    at io.typefox.yang.serializer.YangSemanticSequencer.sequence(YangSemanticSequencer.java:585)
    at org.eclipse.xtext.serializer.sequencer.AbstractSemanticSequencer.createSequence(AbstractSemanticSequencer.java:68)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:327)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:354)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:248)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:452)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:512)
    at io.typefox.yang.serializer.YangSemanticSequencer.sequence_XpathStep(YangSemanticSequencer.java:2713)
    at io.typefox.yang.serializer.YangSemanticSequencer.sequence(YangSemanticSequencer.java:658)
    at org.eclipse.xtext.serializer.sequencer.AbstractSemanticSequencer.createSequence(AbstractSemanticSequencer.java:68)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:327)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:354)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:248)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:452)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:512)
    at io.typefox.yang.serializer.YangSemanticSequencer.sequence_XpathPathExpr(YangSemanticSequencer.java:2379)
    at io.typefox.yang.serializer.YangSemanticSequencer.sequence(YangSemanticSequencer.java:550)
    at org.eclipse.xtext.serializer.sequencer.AbstractSemanticSequencer.createSequence(AbstractSemanticSequencer.java:68)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptAction(SequenceFeeder.java:319)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:121)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:454)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:512)
    at io.typefox.yang.serializer.YangSemanticSequencer.sequence_XpathPathExpr(YangSemanticSequencer.java:2379)
    at io.typefox.yang.serializer.YangSemanticSequencer.sequence(YangSemanticSequencer.java:550)
    at org.eclipse.xtext.serializer.sequencer.AbstractSemanticSequencer.createSequence(AbstractSemanticSequencer.java:68)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:327)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:354)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:248)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:452)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:512)
    at io.typefox.yang.serializer.YangSemanticSequencer.sequence_Path_StatementEnd(YangSemanticSequencer.java:1536)
    at io.typefox.yang.serializer.YangSemanticSequencer.sequence(YangSemanticSequencer.java:319)
    at org.eclipse.xtext.serializer.sequencer.AbstractSemanticSequencer.createSequence(AbstractSemanticSequencer.java:68)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:327)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:354)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:265)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:445)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:512)
    at io.typefox.yang.serializer.YangSemanticSequencer.sequence_StatementEnd_Type(YangSemanticSequencer.java:1800)
    at io.typefox.yang.serializer.YangSemanticSequencer.sequence(YangSemanticSequencer.java:387)
    at org.eclipse.xtext.serializer.sequencer.AbstractSemanticSequencer.createSequence(AbstractSemanticSequencer.java:68)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:327)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:354)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:265)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:445)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:512)
    at io.typefox.yang.serializer.YangSemanticSequencer.sequence_Leaf_StatementEnd(YangSemanticSequencer.java:1337)
    at io.typefox.yang.serializer.YangSemanticSequencer.sequence(YangSemanticSequencer.java:262)
    at org.eclipse.xtext.serializer.sequencer.AbstractSemanticSequencer.createSequence(AbstractSemanticSequencer.java:68)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:327)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:354)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:265)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:445)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:512)
    at io.typefox.yang.serializer.YangSemanticSequencer.sequence_List_StatementEnd(YangSemanticSequencer.java:1367)
    at io.typefox.yang.serializer.YangSemanticSequencer.sequence(YangSemanticSequencer.java:271)
    at org.eclipse.xtext.serializer.sequencer.AbstractSemanticSequencer.createSequence(AbstractSemanticSequencer.java:68)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:327)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:354)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:265)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:445)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:512)
    at io.typefox.yang.serializer.YangSemanticSequencer.sequence_Container_StatementEnd(YangSemanticSequencer.java:865)
    at io.typefox.yang.serializer.YangSemanticSequencer.sequence(YangSemanticSequencer.java:196)
    at org.eclipse.xtext.serializer.sequencer.AbstractSemanticSequencer.createSequence(AbstractSemanticSequencer.java:68)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:327)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:354)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:265)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:445)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:512)
    at io.typefox.yang.serializer.YangSemanticSequencer.sequence_Container_StatementEnd(YangSemanticSequencer.java:865)
    at io.typefox.yang.serializer.YangSemanticSequencer.sequence(YangSemanticSequencer.java:196)
    at org.eclipse.xtext.serializer.sequencer.AbstractSemanticSequencer.createSequence(AbstractSemanticSequencer.java:68)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:327)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:354)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:265)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:445)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:512)
    at io.typefox.yang.serializer.YangSemanticSequencer.sequence_Augment_StatementEnd(YangSemanticSequencer.java:751)
    at io.typefox.yang.serializer.YangSemanticSequencer.sequence(YangSemanticSequencer.java:153)
    at org.eclipse.xtext.serializer.sequencer.AbstractSemanticSequencer.createSequence(AbstractSemanticSequencer.java:68)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:327)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:354)
    at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:265)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:445)
    at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:512)
    at io.typefox.yang.serializer.YangSemanticSequencer.sequence_StatementEnd_Submodule(YangSemanticSequencer.java:1786)
    at io.typefox.yang.serializer.YangSemanticSequencer.sequence(YangSemanticSequencer.java:384)
    at org.eclipse.xtext.serializer.sequencer.AbstractSemanticSequencer.createSequence(AbstractSemanticSequencer.java:68)
    at org.eclipse.xtext.serializer.impl.Serializer.serialize(Serializer.java:122)
    at org.eclipse.xtext.serializer.impl.Serializer.serializeToRegions(Serializer.java:144)
    at org.eclipse.xtext.serializer.impl.Serializer.serialize(Serializer.java:150)
    at org.eclipse.xtext.serializer.impl.Serializer.serialize(Serializer.java:184)
    at io.typefox.yang.resource.YangSerializer.serialize(YangSerializer.java:19)
    at YangTest.main(YangTest.java:130)
dhuebner commented 2 years ago

From the example I received this is the constellation:

main-module includes some submodules:

module test-module {
    yang-version 1.1;
    namespace urn:ietf:params:xml:ns:yang:test-module;
    prefix ts-mod;

    include sub-module0;
    include sub-module1;
    include sub-module2;
}

sub-module0 defines a contianer:

submodule sub-module0 {
    yang-version 1.1;
    belongs-to test-module {
        prefix ts-mod;
    }
    container "container" {
    }
}

sub-module1 has an augment to enhance the container:

submodule sub-module1 {
    yang-version 1.1;
    belongs-to test-module {
        prefix ts-mod;
    }

    include "sub-module0";

    augment /container {
        leaf leaf_from_sub1 {
            type int64;
        }
    }
}

sub-module2 has an augment to enhance the container and uses a leaf from sub-module1 augment as leafref:

submodule sub-module2 {
    yang-version 1.1;
    belongs-to test-module {
        prefix ts-mod;
    }
    include sub-module0;

    augment /container {
        leaf leaf_from_sub2 {
            type leafref {
                path "/container/leaf_from_sub1";
            }
        }
    }
}

The error you posted appears because the reference from sub-module2 to sub-module1 over path "/container/leaf_from_sub1"; can not be resolved.

dhuebner commented 2 years ago

@RimShao I was able to fix my test case by including the sub-module1 in sub-module2 so that the augment from sub-module1 is applied.

submodule sub-module2 {
    yang-version 1.1;
    belongs-to test-module {
        prefix ts-mod;
    }

    include sub-module0;
    // need to include in order to reference augments from sub-module1
    include sub-module1;

    augment /container {
        leaf leaf_from_sub2 {
            type leafref {
                path "/container/leaf_from_sub1";
            }
        }
    }
}

From the stacktrace you posted, you could try to include test-policy-cncfw in test-ddos-cncfw. Please let me know if it works or not.

RimShao commented 2 years ago

Hi Dennis,

Thanks for the information.

yang-lsp 0.3.1 doesn't have this problem, and neither pyang/confdc validation result reports this submodule missing error.

Is there improvement needed in yang-lsp?

Thanks.

//BR Rim

RimShao commented 2 years ago

Hi Dennis,

Have tried include test-policy-cncfw in test-ddos-cncfw, the problem still exists.

//BR Rim

dhuebner commented 2 years ago

@RimShao

yang-lsp 0.3.1 doesn't have this problem, and neither pyang/confdc validation result reports this submodule missing error.

I see, thanks for the hint. Than it meight be ralted to #216 I will check that

dhuebner commented 2 years ago

@RimShao Serializer is now more lax when serializing objects that are not in actual scope, but have a resolved target element and corresponding text node.

Please try the latest v0.7.1 release (probably still syncing with maven repos) or the latest Snapshot