public static UnifiedClassDefinition CreateClassDefinition(
            Construct construct)
        {
            var klass = UnifiedClassDefinition.Create();

            ParseClass(construct, klass.Body);
            return(klass);
        }
예제 #2
0
 public static UnifiedClassDefinition CreateModule(XElement node)
 {
     Contract.Requires(node != null);
     Contract.Requires(node.Name() == "module");
     return(UnifiedClassDefinition.Create(
                null, null, CreateSymbol(node.NthElement(0)), null,
                null,
                CreateScope(node.NthElement(1))));
 }
 /// <summary>
 ///   クラス内から public なインスタンスフィールドを検索して取得します
 /// </summary>
 /// <param name="cls"> クラスオブジェクト </param>
 /// <returns> public なインスタンスフィールドの UnifiedVariableDefinition オブジェクトの集合 </returns>
 public static IEnumerable<UnifiedVariableDefinition> FindPublicFields(
     UnifiedClassDefinition cls)
 {
     return cls.Descendants<UnifiedVariableDefinition>()
             .Where(
                     e => e.Modifiers
                                  .Any(m => m.Name == "public"))
             .Where(
                     e => e.Modifiers
                                  .All(m => m.Name != "static"));
 }
예제 #4
0
        public static UnifiedClassDefinition CreateClass(XElement node)
        {
            Contract.Requires(node != null);
            Contract.Requires(node.Name() == "class");
            var constNode = node.NthElement(1);
            var constrain = constNode.Name() != "nil"
                                    ? UnifiedExtendConstrain.Create(
                UnifiedType.Create(constNode.Value))
                                    : null;

            return(UnifiedClassDefinition.Create(
                       null, null, CreateSymbol(node.NthElement(0)), null,
                       constrain.ToSet <UnifiedTypeConstrain>(),
                       CreateScope(node.NthElement(2))));
        }
예제 #5
0
        public static Namespace GetNamespace(UnifiedClassDefinition classNode)
        {
            var type = NamespaceType.Class;
            var className =
                    classNode.FirstDescendant<UnifiedVariableIdentifier>().Name;
            var parents =
                    DetectorHelper.GetParentTypes(type).Select(
                            t => DetectorHelper.Namespace2UnifiedType(t));
            var parentNode = DetectorHelper.GetFirstFoundNode(
                    classNode, parents);

            return new Namespace {
                    Value = className,
                    NamespaceType = type,
                    Parent = Dispatcher(parentNode),
            };
        }
        public override bool Visit(
                UnifiedClassDefinition element, VisitorArgument arg)
        {
            element.Annotations.TryAccept(this, arg);
            element.Modifiers.TryAccept(this, arg);
            Writer.Write("class");
            Writer.Write(" ");
            element.Name.TryAccept(this, arg);
            Writer.Write(":");
            Writer.Write(" # ");
            element.GenericParameters.TryAccept(this, arg);
            element.Constrains.TryAccept(this, arg);
            Writer.WriteLine();

            element.Body.TryAccept(this, arg.IncrementDepth());
            return false;
        }
예제 #7
0
        public override bool Visit(
            UnifiedClassDefinition element, VisitorArgument arg)
        {
            element.Annotations.TryAccept(this, arg);
            element.Modifiers.TryAccept(this, arg);
            Writer.Write("class");
            Writer.Write(" ");
            element.Name.TryAccept(this, arg);
            Writer.Write(":");
            Writer.Write(" # ");
            element.GenericParameters.TryAccept(this, arg);
            element.Constrains.TryAccept(this, arg);
            Writer.WriteLine();

            element.Body.TryAccept(this, arg.IncrementDepth());
            return(false);
        }
 public override bool Visit(
         UnifiedClassDefinition element, VisitorArgument arg)
 {
     return Visit(element, arg, "class");
 }
 public override bool Visit(
     UnifiedClassDefinition element, VisitorArgument arg)
 {
     element.Body.TryAccept(this, arg.Set(ForBlock));
     return(true);
 }
 public override bool Visit(
         UnifiedClassDefinition element, VisitorArgument arg)
 {
     element.Body.TryAccept(this, arg.Set(ForBlock));
     return true;
 }
예제 #11
0
        public UnifiedElement VisitTypeDeclaration(
            TypeDeclaration dec, object data)
        {
            var attrs      = dec.Attributes.AcceptVisitorAsAttrs(this, data);
            var mods       = LookupModifiers(dec.Modifiers);
            var name       = UnifiedVariableIdentifier.Create(dec.Name);
            var typeParams = dec.TypeParameters.AcceptVisitorAsTypeParams(
                this, data);

            if (typeParams.Count == 0)
            {
                typeParams = null;
            }
            var extends = dec.BaseTypes.AcceptVisitorAsConstrains(this, data);
            var body    = UnifiedBlock.Create();

            foreach (var node in dec.Members)
            {
                var uExpr = node.TryAcceptForExpression(this);
                if (uExpr != null)
                {
                    body.Add(uExpr);
                }
            }
            // set constraint
            var dic = CreateDictionary(dec.Constraints);

            if (typeParams != null)
            {
                foreach (
                    var generic in
                    typeParams.Descendants <UnifiedGenericParameter>(

                        ))
                {
                    var tName = GetTypeName(generic.Type);
                    if (dic.ContainsKey(tName))
                    {
                        foreach (var c in dic[tName])
                        {
                            if (generic.Constrains == null)
                            {
                                generic.Constrains =
                                    UnifiedSet <UnifiedTypeConstrain> .Create();
                            }
                            generic.Constrains.Add(c.DeepCopy());
                        }
                    }
                }
            }
            foreach (
                var generic in
                extends.Descendants <UnifiedGenericParameter>())
            {
                var tName = GetTypeName(generic.Type);
                if (dic.ContainsKey(tName))
                {
                    foreach (var c in dic[tName])
                    {
                        if (generic.Constrains == null)
                        {
                            generic.Constrains =
                                UnifiedSet <UnifiedTypeConstrain> .Create();
                        }
                        generic.Constrains.Add(c.DeepCopy());
                    }
                }
            }

            switch (dec.ClassType)
            {
            case ClassType.Class:
                return(UnifiedClassDefinition.Create(
                           attrs, mods, name, typeParams, extends, body));

            case ClassType.Struct:
                return(UnifiedStructDefinition.Create(
                           attrs, mods, name, typeParams, extends, body));

            case ClassType.Interface:
                return(UnifiedInterfaceDefinition.Create(
                           attrs, mods, name, typeParams, extends, body));

            case ClassType.Enum:
                return(UnifiedEnumDefinition.Create(
                           attrs, mods, name, typeParams, extends, body));
            }
            var msg = "LookupClassKind : " + dec.ClassType + "には対応していません。";

            throw new InvalidOperationException(msg);
        }
 public override bool Visit(
     UnifiedClassDefinition element, VisitorArgument arg)
 {
     return(Visit(element, arg, "class"));
 }