Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

CppContainerList throws "The item belongs already to a container" when parsing VTK 9.5 headers Body

Aperta
#122 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
3/5
Tempo stimato
1-2 giorni
Idoneità per principianti
55/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Tranquilla
Stack tecnologico
cpp, csharp
Ambito
compilers

Direzione di ricerca

Inizia con CppContainerList.Add e Insert, quindi segui CppModelBuilder.GetCppTypeInternal attraverso CXType_Unexposed e ParseTemplateSpecializedArguments. Riproduci il problema analizzando vtkActor.h di VTK 9.5 con le opzioni mostrate. Il lavoro è completato quando l’header viene analizzato senza l’eccezione di ownership del container, mentre il comportamento per i duplicati e il parent rimane coperto.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Description

When parsing VTK 9.5 headers with CppParser.ParseFile, an ArgumentException is thrown:

System.ArgumentException: The item belongs already to a container
   at CppAst.CppContainerList`1.Add(TElement item)
   at CppAst.CppContainerList`1.AddRange(IEnumerable`1 collection)
   at CppAst.CppModelBuilder.GetCppTypeInternal(CXCursor cursor, CXType type, CXCursor parent, Void* data)

Reproduction

var options = new CppParserOptions();
options.ConfigureForWindowsMsvc(CppTargetCpu.X86_64, CppVisualStudioVersion.VS2022);
options.IncludeFolders.Add(@"C:\Program Files\VTK\include\vtk-9.5");
var compilation = CppParser.ParseFile(@"C:\Program Files\VTK\include\vtk-9.5\vtkActor.h", options);

Environment: VTK 9.5 headers, CppAst 0.25.0, ClangSharp 21.1.8.3, Windows x64.

Root Cause

The problem is in CppContainerList<T>.Add() — it enforces strict single-parent ownership:

public void Add(TElement item)
{
    if (item.Parent != null)
        throw new ArgumentException("The item belongs already to a container");
    ...
}

During GetCppTypeInternal → CXType_Unexposed handling, ParseTemplateSpecializedArguments resolves template arguments that return type instances already belonging to a container (e.g., a CppClass that was added to compilation.Classes). When these same instances are added to CppUnexposedType.TemplateParameters via AddRange, the strict check fails.

The stack trace consistently points to:

GetCppTypeInternal → VisitElaboratedDecl → GetCppType → GetCppTypeInternal → VisitFunctionDecl → CppContainerList.AddRange

Suggested Fix

Relax Add and Insert to allow re-parenting. Skip duplicates in the same container, otherwise allow the element to move:

public void Add(TElement item)
{
    if (item.Parent == Container)
        return; // Already in this container
    item.Parent = Container;
    _elements.Add(item);
}

public void Insert(int index, TElement item)
{
    if (item.Parent == Container)
        return; // Already in this container
    item.Parent = Container;
    _elements.Insert(index, item);
}

This is the same approach taken by XML DOM implementations — a node can be moved from one parent to another without error.

Lingua principale
C#
Stelle
623
Fork
79
Merge medio
2g 2h
PR unite (30g)
1

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di xoofx/CppAst.NET

Tutte le issue di xoofx/CppAst.NET

Issue simili

Altre issue su C#

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.