Skip to content

fix CoCo error 0x10AA1 - imported and quoted PartDef resolution#153

Draft
linggd wants to merge 5 commits into
release/7.8.xfrom
ln/apollo-coco-0x10AA1
Draft

fix CoCo error 0x10AA1 - imported and quoted PartDef resolution#153
linggd wants to merge 5 commits into
release/7.8.xfrom
ln/apollo-coco-0x10AA1

Conversation

@linggd

@linggd linggd commented Jun 22, 2026

Copy link
Copy Markdown
Collaborator

The Apollo-11 models can already be parsed #146 . The symbol resolution and CoCos are adapted so that the models also pass the CoCos.

2 of 5 CoCo errors addressed

0x10AA1 — PartDef resolution

Apollo introduced several cases that were not covered by the previous models:

  • PartUsages with both : typing and :> specialization. The CoCo incorrectly checked both as PartDefs.,
  • Imported PartDefs. Import-aware resolution existed for resolveType(), but not for resolvePartDef().,
  • Imports declared in the current package scope. The existing logic only checked the enclosing scope and therefore missed these imports.,
  • Quoted names containing dots, such as 'Roger B. Chaffee'. The dots were incorrectly interpreted as qualification separators.,

These cases exposed missing or incorrect behavior in the PartDef resolution.

Changelog

Fix

  • use resolveType() instead of resolvePartDef() in PartTypeDefinitionExistsCoCo.
  • Collect imports from the current scope before continuing resolution in the enclosing scope.

@linggd linggd marked this pull request as ready for review June 22, 2026 22:47
@@ -1,18 +1,23 @@
package parser;
package cocos;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Die Änderungen an dieser Datei scheinen zu sein:

##### Changed

* ApolloTest baut jetzt auch Symboltabelle auf und wurde vorbereitet fürs Testen der CoCos
    - Deswegen von Paket "parser" nach "cocos" verschoben

Bitte in einen getrennten MR packen


var scope = node.getEnclosingScope();

// Unnamed PartUsages are allowed and are ignored by this check.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Die Änderungen an dieser Datei scheinen zu sein:

##### Fixed

* Anonyme PartUsages haben zu Crashes bei der Überprüfung der Eindeutigkeit des Namens geführt
   - Werden jetzt von der CoCo ignoriert

Bitte in einen getrennten MR packen

@Override
public void check(ASTPartUsage node) {
var nonExistent = node.streamSpecializations()
.filter(s -> s instanceof ASTSysMLTyping)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Diese Änderung ist nicht ausreichend erklärt. Könntest du bitte ein minimalen Beispielmodell angeben, für das diese CoCo fälschlicherweise einen Fehler meldet, in: https://git.rwth-aachen.de/montibelle/frontend/transformer/sysmltransformer/-/work_items/323

Die Änderung wir aus diesem MR entfernt. Dann wird im angegebenen Ticket das Problem festgestellt, sende mir auf Slack einen Nachricht, sobald ich mir das anschauen kann. Danach klären wir, wie die Lösung aussehen wird.

* Before continuing into the enclosing scope, apply the
* imports declared in the current scope.
*/
collectImportsFromScope(this, importStatements);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Die Änderungen hier scheinen u.A. auf diese Zeile zurückführbar zu sein:

Imported PartDefs. Import-aware resolution existed for resolveType(), but not for resolvePartDef().,

Wir werden für diesen Teil des Problems die entsprechenden Stellen (zB. die CoCo PartTypeDefExists) so umbauen, dass sie mit resolveType statt resolvePartDef arbeiten. Die Änderungen dazu hier werden erstmal wieder rückgängig gemacht

* First try normal resolution. Only if that fails, resolve the imported
* package and search for the unchanged name inside its local scope.
*/
if (result.isEmpty() && name.contains(".")) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dieser Spezialfall ist nicht ausreichend diskutiert, entfernen hier alles dazu und klären zuerst alle Probleme und mögliche Lösungen: https://git.rwth-aachen.de/montibelle/frontend/transformer/sysmltransformer/-/work_items/324

@mathias-pfeiffer

Copy link
Copy Markdown
Contributor

@linggd bitte erkläre kurz was mit "Imports declared in the current package scope. The existing logic only checked the enclosing scope and therefore missed these imports.," gemeint ist und welche der Änderungen zu diesem Punkt gehören. Bis auf diesen Punkt wurden alle anderen Inhalte in eigene Tickets verlagert und werden in getrennten PRs behandelt.

@mathias-pfeiffer mathias-pfeiffer marked this pull request as draft June 24, 2026 14:01
@linggd

linggd commented Jun 25, 2026

Copy link
Copy Markdown
Collaborator Author

@linggd bitte erkläre kurz was mit "Imports declared in the current package scope. The existing logic only checked the enclosing scope and therefore missed these imports.," gemeint ist und welche der Änderungen zu diesem Punkt gehören. Bis auf diesen Punkt wurden alle anderen Inhalte in eigene Tickets verlagert und werden in getrennten PRs behandelt.

Erklärung

Die Methode continueTypeWithEnclosingScope(...) in ISysMLScope.java hat Imports immer im Enclosing Scope gesucht :

if(getEnclosingScope().isPresentAstNode()) {
        var visitor = new SysMLPartsVisitor2() {
          @Override
          public void visit(ASTSysMLImportStatement node) {
            if (getEnclosingScope().equals(node.getEnclosingScope())) {
              importStatements.add(new ImportStatement(node.getMCQualifiedName().getQName(),
                  node.isStar() || node.isRecursive()));
            }
          }
        };
        var traverser = SysMLv2Mill.inheritanceTraverser();
        traverser.add4SysMLParts(visitor);
        getEnclosingScope().getAstNode().accept(traverser);
      }

Bei diesem Modell funktioniert das:

package VehiclePackage {
  import Definitions::*;

  part def Vehicle {
    part wheel : Wheel;
  }
}

Beim Auflösen von Wheel ist der aktuelle Scope Vehicle. Durch den Aufruf getEnclosingScope().getAstNode().accept(traverser); wird anschließend der enclosing Scope VehiclePackage traversiert. Dort steht der Import, deshalb wird er gefunden.

Im Apollo-Modell liegt aber der Part direkt im Package:

package StakeholderPackage {
  private import CoSMAPackage::*;

  part AstronautFamilies : Stakeholder;
}

Hier wird Stakeholder aus dem CoSMAPackage importiert.

Beim Auflösen von Stakeholder ist der aktuelle Scope schon StakeholderPackage. Der Enclosing Scope ist dann der Artifact Scope.

Der Import steht aber im aktuellen StakeholderPackage. Die alte Implementierung hat diesen Import deshalb nicht gefunden.

Die neue Implementierung sucht zuerst die Imports im aktuellen Scope und geht danach weiter zum Enclosing Scope.

Die Änderung gehört zu :

collectImportsFromScope(...)

@mathias-pfeiffer

Copy link
Copy Markdown
Contributor

Die Methode continueTypeWithEnclosingScope(...) in ISysMLScope.java hat Imports immer im Enclosing Scope gesucht

Dh. du hast einen Fehler in continueTypeWithEnclosingScope entdeckt, aber keine Änderung am Code gemacht:

image

Kannst du das noch klarstellen?

@linggd

linggd commented Jun 26, 2026

Copy link
Copy Markdown
Collaborator Author

Die Methode continueTypeWithEnclosingScope(...) in ISysMLScope.java hat Imports immer im Enclosing Scope gesucht

Dh. du hast einen Fehler in continueTypeWithEnclosingScope entdeckt, aber keine Änderung am Code gemacht:

image Kannst du das noch klarstellen?

Die ursprüngliche CoCo hat resolvePartDef(...) verwendet. Deshalb hatte ich die Behandlung der Imports aus dem aktuellen Scope zunächst in continuePartDefWithEnclosingScope(...) ergänzt.
Es war mein Fehler, dass ich die Implementierung noch nicht auch auf continueTypeWithEnclosingScope(...) übertragen hatte.

Nach deinem Hinweis, dass die CoCo stattdessen resolveType(...) verwenden soll, läuft die Auflösung jedoch über continueTypeWithEnclosingScope(...). Deshalb bezieht sich meine spätere Erklärung auf continueTypeWithEnclosingScope(...).

Ich werde die entsprechende Änderung auch in continueTypeWithEnclosingScope(...) umsetzen.

ling guo dei added 3 commits June 26, 2026 22:41
@linggd linggd force-pushed the ln/apollo-coco-0x10AA1 branch from 6feb30a to c20d4b6 Compare June 28, 2026 22:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants