Beispiel #1
0
        public InterUserType(InterType type) : base()
        {
            _intertype = type;

            Name      = $"class {_intertype.FullName}";
            ShortName = $"{_intertype.FullName}";
        }
 public InterType AddType(InterType type)
 {
     CurrentType   = type;
     CurrentMethod = null;
     Types.Add(type);
     return(type);
 }
Beispiel #3
0
        public void CompileClass(SyntaxTreeNode node)
        {
            string name = node[0].ValueString;

            var context = new ResolutionContext(builder.Namespaces);

            foreach (var gen in node[3].Children)
            {
                context.AddGenericParameter(gen.ValueString);
            }

            var type = new InterType(name, context, TypeNameFromNode(node[1][0]), context.GenericParameters.Count);

            foreach (var n in node[2].Children)
            {
                type.AddFlag(n.ValueString);
            }
            builder.AddType(type);
            CompileNode(node[4]);
            builder.CurrentType = null;
        }
Beispiel #4
0
        // 統合コードオブジェクトに対してアスペクトの合成処理を行います
        public static void Weave(string language, UnifiedProgram model)
        {
            //以前のアスペクトファイルの情報を消去するために辞書の内容を初期化する
            Pointcuts.Clear();

            //与えられたモデルに対してインタータイプを合成する
            foreach (var intertype in _visitor.Intertypes)
            {
                if (intertype.GetLanguageType() != language)
                {
                    continue;
                }
                var members = UcoGenerator.CreateIntertype(
                    intertype.GetLanguageType(), intertype.GetContents());
                InterType.AddIntertypeDeclaration(model, intertype.GetTarget(), members);
            }

            //ポイントカットを登録する
            foreach (var pointcut in _visitor.Pointcuts)
            {
                var name = pointcut.GetName();
                //同じ名前のポイントカットがある場合にはエラーとする
                if (Pointcuts.ContainsKey(name))
                {
                    throw new InvalidOperationException(
                              "同名のポイントカットがすでに宣言されています: " + name);
                }
                //ポイントカットを自身の名前で登録
                Pointcuts.Add(name, pointcut);
            }

            //アドバイスの適用
            foreach (var advice in _visitor.Advices)
            {
                //アドバイスのターゲットがポイントカット宣言されていない場合はエラーとする
                if (!Pointcuts.ContainsKey(advice.GetTarget()))
                {
                    throw new InvalidOperationException(
                              "指定されたポイントカットは宣言されていません");
                }

                //アドバイスのターゲットが登録されていれば、それに対応するポイントカットを取得する
                Pointcut target;
                Pointcuts.TryGetValue(advice.GetTarget(), out target);

                //指定された言語のアドバイスがあればそれをモデルに変換する
                UnifiedBlock code = null;
                foreach (var languageDependBlock in advice.GetFragments())
                {
                    //
                    if (languageDependBlock.GetLanguageType().Equals(language))
                    {
                        code = UcoGenerator.CreateAdvice(
                            language, languageDependBlock.GetContents());
                        break;
                    }
                }
                //現在の対象ファイルの言語向けアドバイスが定義されていない場合は次のアドバイス処理に移る
                if (code == null)
                {
                    continue;
                }

                //ポイントカットの指定に応じて適切なアドバイスの合成処理を行う
                //TODO ワイルドカードなどへの対応
                //TODO 複数のターゲットを持つポイントカットへの対応(これはそもそもパーサを改良する必要あり)

                var methodName = target.GetTargetName().ElementAt(1);

                // アドバイスの合成
                // リフレクション(MEF)を用いて、対応するメソッドが呼び出されます
                switch (advice.GetAdviceType())
                {
                case "before":
                    CodeProcessorProvider.WeavingBefore(target.GetPointcutType(), model, target.DeepCopy(), code);
                    break;

                case "after":
                    CodeProcessorProvider.WeavingAfter(target.GetPointcutType(), model, target.DeepCopy(), code);
                    break;

                default:
                    throw new InvalidOperationException();
                }
            }
        }
Beispiel #5
0
 public BasicTypeName(string name, InterType type) : base(name, type.NamespaceContext)
 {
 }