public override void visit(SyntaxTree.unnamed_type_object unn) // SSM 27.06.13 { var l = unn.ne_list; var names = l.name_expr.Select(x=>x.name).ToList(); var strnames = names.Select(id=>id.name).ToList(); // преобразование idents в строки var semantic_types = l.name_expr.Select(x => convert_strong(x.expr).type).ToList(); var types = semantic_types.Select(x => SyntaxTreeBuilder.BuildSemanticType(x)).ToList(); contextChanger.SaveContextAndUpToGlobalLevel(); var tt = context._cmn.types.Where(t => t.name.StartsWith("AnonymousType#")); // найти все анонимные типы, полученные в текущей компиляции var typ = tt.FirstOrDefault(t => SameTypeAutoClasses(strnames, semantic_types, t)); // найти структурно совпадающий уже существующий анонимный тип // Генерация глобальных описаний - перенесена с синтаксического уровня if (typ != null) unn.set_name(typ.name); // если нашли, то просто меняем имя на имя этого класса else { var td = SyntaxTreeBuilder.BuildAutoClass(unn.name(), names, types, unn.is_class); visit(td); } contextChanger.RestoreCurrentContext(); // Сахарный узел. Переадресация дальнейшей генерации узлу new_ex visit(unn.new_ex); }