CppContainerList throws "The item belongs already to a container" when parsing VTK 9.5 headers Body
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 55/100
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
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di xoofx/CppAst.NET
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 35/100
xoofx/CppAst.NET#117 ·
-
Parsing .cpp implementation?Apertaquestion
Difficoltà 5/5 Più di una settimana Idoneità per principianti 25/100
xoofx/CppAst.NET#115 · 3 commenti ·
-
question
Difficoltà 4/5 3-5 giorni Idoneità per principianti 38/100
xoofx/CppAst.NET#95 · 4 commenti ·
-
NullReferenceException when parsing instantiation of a previously partially specialised templateApertabug
Difficoltà 2/5 1-3 ore Idoneità per principianti 35/100
xoofx/CppAst.NET#77 · 6 commenti ·
-
bug PR Welcome
Difficoltà 2/5 1-3 ore Idoneità per principianti 55/100
xoofx/CppAst.NET#73 ·
Tutte le issue di xoofx/CppAst.NET
Issue simili
-
area/indexing bug package/core triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
I maintainer di solito rispondono entro 1 giorno
-
enhancement needs triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
elastic/docs-builder#4495 ·
I maintainer di solito rispondono entro 1 giorno
-
ASP.NET Core container quickstart: `docker-run: debug` task sample is missing its closing braceAperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 88/100
microsoft/vscode-docs#10499 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 69/100
SourceDotNET/Source.NET#203 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno