diff --git a/ClangAstParser/src/pt/up/fe/specs/clang/parsers/data/ClavaDataParsers.java b/ClangAstParser/src/pt/up/fe/specs/clang/parsers/data/ClavaDataParsers.java index 3708d1380..531c6feea 100644 --- a/ClangAstParser/src/pt/up/fe/specs/clang/parsers/data/ClavaDataParsers.java +++ b/ClangAstParser/src/pt/up/fe/specs/clang/parsers/data/ClavaDataParsers.java @@ -48,9 +48,11 @@ import pt.up.fe.specs.clava.ast.decl.data.templates.TemplateArgumentTemplate; import pt.up.fe.specs.clava.ast.decl.data.templates.TemplateArgumentTemplateExpansion; import pt.up.fe.specs.clava.ast.decl.data.templates.TemplateArgumentType; +import pt.up.fe.specs.clava.ast.decl.data.templates.template.DependentTemplate; import pt.up.fe.specs.clava.ast.decl.data.templates.template.QualifiedTemplate; import pt.up.fe.specs.clava.ast.decl.data.templates.template.SubstTemplateTemplateParm; import pt.up.fe.specs.clava.ast.decl.data.templates.template.Template; +import pt.up.fe.specs.clava.ast.decl.data.templates.template.UsingTemplate; import pt.up.fe.specs.clava.ast.decl.enums.ExplicitSpecKind; import pt.up.fe.specs.clava.ast.decl.enums.NestedNameSpecifierKind; import pt.up.fe.specs.clava.ast.expr.data.designator.ArrayDesignator; @@ -356,6 +358,13 @@ public static TemplateArgumentTemplate templateArgumentTemplate(LineStream lines parserData.getClavaNodes().queueSetNode(template, SubstTemplateTemplateParm.PARAMETER, lines.nextLine()); template.set(SubstTemplateTemplateParm.REPLACEMENT, templateArgumentTemplate(lines, parserData)); break; + case UsingTemplate: + parserData.getClavaNodes().queueSetNode(template, UsingTemplate.USING_SHADOW_DECL, lines.nextLine()); + break; + case DependentTemplate: + template.set(DependentTemplate.QUALIFIER, lines.nextLine()); + template.set(DependentTemplate.NAME, lines.nextLine()); + break; default: throw new RuntimeException("Case not implemented: " + nameKind); } diff --git a/ClavaAst/src/pt/up/fe/specs/clava/ast/decl/data/templates/TemplateArgumentTemplate.java b/ClavaAst/src/pt/up/fe/specs/clava/ast/decl/data/templates/TemplateArgumentTemplate.java index 2c2f30226..7713716e0 100644 --- a/ClavaAst/src/pt/up/fe/specs/clava/ast/decl/data/templates/TemplateArgumentTemplate.java +++ b/ClavaAst/src/pt/up/fe/specs/clava/ast/decl/data/templates/TemplateArgumentTemplate.java @@ -16,9 +16,11 @@ import org.suikasoft.jOptions.Datakey.DataKey; import org.suikasoft.jOptions.Datakey.KeyFactory; +import pt.up.fe.specs.clava.ast.decl.data.templates.template.DependentTemplate; import pt.up.fe.specs.clava.ast.decl.data.templates.template.QualifiedTemplate; import pt.up.fe.specs.clava.ast.decl.data.templates.template.SubstTemplateTemplateParm; import pt.up.fe.specs.clava.ast.decl.data.templates.template.Template; +import pt.up.fe.specs.clava.ast.decl.data.templates.template.UsingTemplate; import pt.up.fe.specs.clava.ast.type.enums.TemplateNameKind; import pt.up.fe.specs.util.exceptions.NotImplementedException; @@ -52,6 +54,10 @@ public static TemplateArgumentTemplate newInstance(TemplateNameKind nameKind) { return new QualifiedTemplate(); case SubstTemplateTemplateParm: return new SubstTemplateTemplateParm(); + case UsingTemplate: + return new UsingTemplate(); + case DependentTemplate: + return new DependentTemplate(); default: throw new NotImplementedException(nameKind); } diff --git a/ClavaAst/src/pt/up/fe/specs/clava/ast/decl/data/templates/template/DependentTemplate.java b/ClavaAst/src/pt/up/fe/specs/clava/ast/decl/data/templates/template/DependentTemplate.java new file mode 100644 index 000000000..e8cf42403 --- /dev/null +++ b/ClavaAst/src/pt/up/fe/specs/clava/ast/decl/data/templates/template/DependentTemplate.java @@ -0,0 +1,43 @@ +/** + * Copyright 2026 SPeCS. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ + +package pt.up.fe.specs.clava.ast.decl.data.templates.template; + +import org.suikasoft.jOptions.Datakey.DataKey; +import org.suikasoft.jOptions.Datakey.KeyFactory; + +import pt.up.fe.specs.clava.ClavaNode; +import pt.up.fe.specs.clava.ast.decl.data.templates.TemplateArgumentTemplate; +import pt.up.fe.specs.clava.ast.type.enums.TemplateNameKind; + +public class DependentTemplate extends TemplateArgumentTemplate { + + /// DATAKEYS BEGIN + + public final static DataKey QUALIFIER = KeyFactory.string("qualifier"); + + public final static DataKey NAME = KeyFactory.string("name"); + + /// DATAKEYS END + + public DependentTemplate() { + super(TemplateNameKind.DependentTemplate); + } + + @Override + public String getCode(ClavaNode node) { + String qualifier = get(QUALIFIER); + String templateKeyword = qualifier.isEmpty() ? "" : "template "; + return qualifier + templateKeyword + get(NAME); + } +} diff --git a/ClavaAst/src/pt/up/fe/specs/clava/ast/decl/data/templates/template/UsingTemplate.java b/ClavaAst/src/pt/up/fe/specs/clava/ast/decl/data/templates/template/UsingTemplate.java new file mode 100644 index 000000000..4a30eeec1 --- /dev/null +++ b/ClavaAst/src/pt/up/fe/specs/clava/ast/decl/data/templates/template/UsingTemplate.java @@ -0,0 +1,41 @@ +/** + * Copyright 2026 SPeCS. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ + +package pt.up.fe.specs.clava.ast.decl.data.templates.template; + +import org.suikasoft.jOptions.Datakey.DataKey; +import org.suikasoft.jOptions.Datakey.KeyFactory; + +import pt.up.fe.specs.clava.ClavaNode; +import pt.up.fe.specs.clava.ast.decl.UsingShadowDecl; +import pt.up.fe.specs.clava.ast.decl.data.templates.TemplateArgumentTemplate; +import pt.up.fe.specs.clava.ast.type.enums.TemplateNameKind; + +public class UsingTemplate extends TemplateArgumentTemplate { + + /// DATAKEYS BEGIN + + public final static DataKey USING_SHADOW_DECL = KeyFactory.object("usingShadowDecl", + UsingShadowDecl.class); + + /// DATAKEYS END + + public UsingTemplate() { + super(TemplateNameKind.UsingTemplate); + } + + @Override + public String getCode(ClavaNode node) { + return get(USING_SHADOW_DECL).getDeclName(); + } +}