public static UnifiedType CreateStructOrUnionSpecifier(XElement node) { Contract.Requires(node != null); Contract.Requires(node.Name() == "struct_or_union_specifier"); /* struct_or_union_specifier * : struct_or_union IDENTIFIER? '{' struct_declaration_list '}' * | struct_or_union IDENTIFIER */ // 構造体の定義と宣言の両方をこのメソッドで作成 // 常に UnifiedType を返すが、 // 構造体定義をしている場合だけ関数の呼び出し元で UnifiedType の中身をとりだす // typedef "struct {}" data; -> クラス? // "struct data {}"; -> クラス // "struct data" a; -> 型 var isStruct = CreateStructOrUnion(node.FirstElement()) == "struct"; var identifier = node.Element("IDENTIFIER"); var typeName = identifier == null ? null : UnifiedVariableIdentifier.Create( identifier.Value); // 型の場合 if (node.Elements().Count() == 2) { var baseType = UnifiedType.Create(typeName); return(isStruct ? baseType.WrapStruct() : baseType.WrapUnion()); } // struct or union の定義がある場合 var body = CreateStructDeclarationList( node.Element("struct_declaration_list")); var structOrUnion = isStruct ? (UnifiedClassLikeDefinition) UnifiedStructDefinition. Create( name: typeName, body: body) : UnifiedUnionDefinition.Create( name: typeName, body: body); // TODO struct or unionはあくまでもTypeとして返すののか? return(UnifiedType.Create(structOrUnion)); }
public override bool Visit( UnifiedUnionDefinition element, VisitorArgument arg) { return Visit(element, arg, "class"); }
public override bool Visit( UnifiedUnionDefinition element, VisitorArgument arg) { throw new NotImplementedException(); }
public override bool Visit( UnifiedUnionDefinition element, VisitorArgument arg) { return(Visit(element, arg, "class")); }