Use property-based serialization for DeclarationName.
authorJohn McCall <rjmccall@apple.com>
Mon, 16 Dec 2019 07:11:49 +0000 (02:11 -0500)
committerJohn McCall <rjmccall@apple.com>
Mon, 16 Dec 2019 18:33:59 +0000 (13:33 -0500)
clang/include/clang/AST/AbstractBasicReader.h
clang/include/clang/AST/AbstractBasicWriter.h
clang/include/clang/AST/PropertiesBase.td

index b18e89b..3685226 100644 (file)
@@ -197,48 +197,6 @@ public:
     return FunctionProtoType::ExtParameterInfo::getFromOpaqueValue(value);
   }
 
-  DeclarationName readDeclarationName() {
-    auto &ctx = getASTContext();
-    auto kind = asImpl().readDeclarationNameKind();
-    switch (kind) {
-    case DeclarationName::Identifier:
-      return DeclarationName(asImpl().readIdentifier());
-
-    case DeclarationName::ObjCZeroArgSelector:
-    case DeclarationName::ObjCOneArgSelector:
-    case DeclarationName::ObjCMultiArgSelector:
-      return DeclarationName(asImpl().readSelector());
-
-    case DeclarationName::CXXConstructorName:
-      return ctx.DeclarationNames.getCXXConstructorName(
-               ctx.getCanonicalType(asImpl().readQualType()));
-
-    case DeclarationName::CXXDestructorName:
-      return ctx.DeclarationNames.getCXXDestructorName(
-               ctx.getCanonicalType(asImpl().readQualType()));
-
-    case DeclarationName::CXXConversionFunctionName:
-      return ctx.DeclarationNames.getCXXConversionFunctionName(
-               ctx.getCanonicalType(asImpl().readQualType()));
-
-    case DeclarationName::CXXDeductionGuideName:
-      return ctx.DeclarationNames.getCXXDeductionGuideName(
-               asImpl().readTemplateDeclRef());
-
-    case DeclarationName::CXXOperatorName:
-      return ctx.DeclarationNames.getCXXOperatorName(
-               asImpl().readOverloadedOperatorKind());
-
-    case DeclarationName::CXXLiteralOperatorName:
-      return ctx.DeclarationNames.getCXXLiteralOperatorName(
-               asImpl().readIdentifier());
-
-    case DeclarationName::CXXUsingDirective:
-      return DeclarationName::getUsingDirectiveName();
-    }
-    llvm_unreachable("bad name kind");
-  }
-
   TemplateName readTemplateName() {
     auto &ctx = getASTContext();
     auto kind = asImpl().readTemplateNameKind();
index 499e5a6..d9ff713 100644 (file)
@@ -178,44 +178,6 @@ public:
     asImpl().writeUInt32(epi.getOpaqueValue());
   }
 
-  void writeDeclarationName(DeclarationName name) {
-    asImpl().writeDeclarationNameKind(name.getNameKind());
-    switch (name.getNameKind()) {
-    case DeclarationName::Identifier:
-      asImpl().writeIdentifier(name.getAsIdentifierInfo());
-      return;
-
-    case DeclarationName::ObjCZeroArgSelector:
-    case DeclarationName::ObjCOneArgSelector:
-    case DeclarationName::ObjCMultiArgSelector:
-      asImpl().writeSelector(name.getObjCSelector());
-      return;
-
-    case DeclarationName::CXXConstructorName:
-    case DeclarationName::CXXDestructorName:
-    case DeclarationName::CXXConversionFunctionName:
-      asImpl().writeQualType(name.getCXXNameType());
-      return;
-
-    case DeclarationName::CXXDeductionGuideName:
-      asImpl().writeDeclRef(name.getCXXDeductionGuideTemplate());
-      return;
-
-    case DeclarationName::CXXOperatorName:
-      asImpl().writeOverloadedOperatorKind(name.getCXXOverloadedOperator());
-      return;
-
-    case DeclarationName::CXXLiteralOperatorName:
-      asImpl().writeIdentifier(name.getCXXLiteralIdentifier());
-      return;
-
-    case DeclarationName::CXXUsingDirective:
-      // No extra data to emit
-      return;
-    }
-    llvm_unreachable("bad name kind");
-  }
-
   void writeTemplateName(TemplateName name) {
     asImpl().writeTemplateNameKind(name.getKind());
     switch (name.getKind()) {
index cdab032..a3f45b0 100644 (file)
@@ -211,3 +211,64 @@ class PropertyTypeCase<PropertyType type, string name> : HasProperties {
   string Name = name;
 }
 
+// DeclarationName
+def : PropertyTypeKind<DeclarationName, DeclarationNameKind,
+                       "node.getNameKind()">;
+let Class = PropertyTypeCase<DeclarationName, "Identifier"> in {
+  def : Property<"identifier", Identifier> {
+    let Read = [{ node.getAsIdentifierInfo() }];
+  }
+  def : Creator<[{
+    return DeclarationName(identifier);
+  }]>;
+}
+foreach count = ["Zero", "One", "Multi"] in {
+  let Class = PropertyTypeCase<DeclarationName, "ObjC"#count#"ArgSelector"> in {
+    def : Property<"selector", Selector> {
+      let Read = [{ node.getObjCSelector() }];
+    }
+    def : Creator<[{
+      return DeclarationName(selector);
+    }]>;
+  }
+}
+foreach kind = ["Constructor", "Destructor", "ConversionFunction"] in {
+  let Class = PropertyTypeCase<DeclarationName, "CXX"#kind#"Name"> in {
+    def : Property<"type", QualType> {
+      let Read = [{ node.getCXXNameType() }];
+    }
+    def : Creator<[{
+      return ctx.DeclarationNames.getCXX}]#kind#[{Name(
+               ctx.getCanonicalType(type));
+    }]>;
+  }
+}
+let Class = PropertyTypeCase<DeclarationName, "CXXDeductionGuideName"> in {
+  def : Property<"declaration", TemplateDeclRef> {
+    let Read = [{ node.getCXXDeductionGuideTemplate() }];
+  }
+  def : Creator<[{
+    return ctx.DeclarationNames.getCXXDeductionGuideName(declaration);
+  }]>;
+}
+let Class = PropertyTypeCase<DeclarationName, "CXXOperatorName"> in {
+  def : Property<"operatorKind", OverloadedOperatorKind> {
+    let Read = [{ node.getCXXOverloadedOperator() }];
+  }
+  def : Creator<[{
+    return ctx.DeclarationNames.getCXXOperatorName(operatorKind);
+  }]>;
+}
+let Class = PropertyTypeCase<DeclarationName, "CXXLiteralOperatorName"> in {
+  def : Property<"identifier", Identifier> {
+    let Read = [{ node.getCXXLiteralIdentifier() }];
+  }
+  def : Creator<[{
+    return ctx.DeclarationNames.getCXXLiteralOperatorName(identifier);
+  }]>;
+}
+let Class = PropertyTypeCase<DeclarationName, "CXXUsingDirective"> in {
+  def : Creator<[{
+    return DeclarationName::getUsingDirectiveName();
+  }]>;
+}