TypeMetadata.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using Microsoft.CodeAnalysis;
  2. using Microsoft.CodeAnalysis.CSharp;
  3. using Microsoft.CodeAnalysis.CSharp.Syntax;
  4. namespace Lua.SourceGenerator;
  5. internal class TypeMetadata
  6. {
  7. public TypeDeclarationSyntax Syntax { get; }
  8. public INamedTypeSymbol Symbol { get; }
  9. public string TypeName { get; }
  10. public string FullTypeName { get; }
  11. public PropertyMetadata[] Properties { get; }
  12. public MethodMetadata[] Methods { get; }
  13. public TypeMetadata(TypeDeclarationSyntax syntax, INamedTypeSymbol symbol, SymbolReferences references)
  14. {
  15. Syntax = syntax;
  16. Symbol = symbol;
  17. TypeName = symbol.ToDisplayString(SymbolDisplayFormat.MinimallyQualifiedFormat);
  18. FullTypeName = symbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
  19. Properties = Symbol.GetAllMembers(false)
  20. .Where(x => x is (IFieldSymbol or IPropertySymbol) and { IsImplicitlyDeclared: false })
  21. .Where(x =>
  22. {
  23. if (!x.ContainsAttribute(references.LuaMemberAttribute)) return false;
  24. if (x.ContainsAttribute(references.LuaIgnoreMemberAttribute)) return false;
  25. if (x is IPropertySymbol p)
  26. {
  27. if (p.GetMethod == null || p.SetMethod == null) return false;
  28. if (p.IsIndexer) return false;
  29. }
  30. return true;
  31. })
  32. .Select(x => new PropertyMetadata(x, references))
  33. .ToArray();
  34. Methods = Symbol.GetAllMembers(false)
  35. .Where(x => x is IMethodSymbol and { IsImplicitlyDeclared: false })
  36. .Select(x => (IMethodSymbol)x)
  37. .Where(x =>
  38. {
  39. if (x.ContainsAttribute(references.LuaIgnoreMemberAttribute)) return false;
  40. return x.ContainsAttribute(references.LuaMemberAttribute) || x.ContainsAttribute(references.LuaMetamethodAttribute);
  41. })
  42. .Select(x => new MethodMetadata(x, references))
  43. .ToArray();
  44. }
  45. public bool IsPartial()
  46. {
  47. return Syntax.Modifiers.Any(m => m.IsKind(SyntaxKind.PartialKeyword));
  48. }
  49. public bool IsNested()
  50. {
  51. return Syntax.Parent is TypeDeclarationSyntax;
  52. }
  53. }