Пример #1
0
        public MacroNode(MacroRefNodeModel model, Store store, GraphView graphView) : base(model, store, graphView)
        {
            m_MacroModel = model;
            AddToClassList("macro");

            m_TitleElement             = this.MandatoryQ("title");
            m_TitleElement.pickingMode = PickingMode.Position;

            this.EnableRename();

            var clickable = new Clickable(DoAction);

            clickable.activators.Clear();
            clickable.activators.Add(
                new ManipulatorActivationFilter {
                button = MouseButton.LeftMouse, clickCount = 2
            });
            this.AddManipulator(clickable);

            IGraphElementModel elementModelToRename = m_Store.GetState().EditorDataModel.ElementModelToRename;

            if (elementModelToRename as MacroRefNodeModel == model)
            {
                ((VseGraphView)m_GraphView).UIController.ElementToRename = this;
            }
        }
        public static IEnumerable <SyntaxNode> BuildMacroRefNode(this RoslynTranslator translator,
                                                                 MacroRefNodeModel model, IPortModel portModel)
        {
            if (model.Macro == null)
            {
                translator.AddError(
                    model,
                    $"The asset of macro node {model.Title} is missing.");
                return(Enumerable.Empty <SyntaxNode>());
            }

            var variableDeclarations = portModel.Direction == Direction.Input
                ? model.DefinedInputVariables
                : model.DefinedOutputVariables;
            var declaration = variableDeclarations.Single(v => v.VariableName == portModel.UniqueId);

            translator.InMacro.Push(model);
            var variableNodeModel = ((VSGraphModel)declaration.GraphModel)
                                    .FindUsages((VariableDeclarationModel)declaration)
                                    .Single();
            var returnValue = translator.BuildPort(variableNodeModel.OutputPort);

            translator.InMacro.Pop();
            return(returnValue);
        }
Пример #3
0
        public static IEnumerable <SyntaxNode> BuildVariable(this RoslynEcsTranslator translator, IVariableModel v, IPortModel portModel)
        {
            if (v is IConstantNodeModel model)
            {
                if (model.ObjectValue != null)
                {
                    yield return(translator.Constant(model.ObjectValue, translator.Stencil, model.Type));
                }

                yield break;
            }

            if (translator.InMacro.Count > 0 && v.DeclarationModel.VariableType == VariableType.GraphVariable && v.DeclarationModel.Modifiers == ModifierFlags.ReadOnly)
            {
                MacroRefNodeModel oldValue = translator.InMacro.Pop();

                var syntaxNodes = translator.BuildPort(oldValue.InputsById[v.DeclarationModel.VariableName]);
                translator.InMacro.Push(oldValue);
                foreach (var syntaxNode in syntaxNodes)
                {
                    yield return(syntaxNode);
                }
                yield break;
            }

            switch (v.DeclarationModel.VariableType)
            {
            case VariableType.GraphVariable:
                yield return(translator.context.GetSingletonVariable(v.DeclarationModel));

                break;

            case VariableType.FunctionVariable:
            case VariableType.ComponentGroupField:
                yield return(RoslynBuilder.LocalVariableReference(v.DeclarationModel.VariableName));

                break;

            case VariableType.FunctionParameter:
                var variableDeclarationModel = v.DeclarationModel;
                if (variableDeclarationModel.VariableIsAGeneratedEcsComponent(out var groupDeclaration))
                {
                    var relevantContext = translator.FindContext(groupDeclaration);
                    translator.context.RecordComponentAccess(relevantContext, v.DeclarationModel.DataType, translator.IsRecordingComponentAccesses);
                    yield return(RoslynBuilder.ArgumentReference(translator.context.GetComponentVariableName(groupDeclaration, variableDeclarationModel.DataType)));
                }
                else
                {
                    yield return(RoslynBuilder.ArgumentReference(v.DeclarationModel.VariableName));
                }
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
        public static IEnumerable <SyntaxNode> BuildVariable(this RoslynTranslator translator, IVariableModel v, IPortModel portModel)
        {
            if (v is IConstantNodeModel constantNodeModel)
            {
                if (constantNodeModel.ObjectValue != null)
                {
                    if (constantNodeModel is IStringWrapperConstantModel)
                    {
                        yield return(translator.Constant(constantNodeModel.ObjectValue.ToString(), translator.Stencil));
                    }
                    else
                    {
                        yield return(translator.Constant(constantNodeModel.ObjectValue, translator.Stencil));
                    }
                }

                yield break;
            }

            if (translator.InMacro.Count > 0 && v.DeclarationModel.VariableType == VariableType.GraphVariable && v.DeclarationModel.Modifiers == ModifierFlags.ReadOnly)
            {
                MacroRefNodeModel oldValue = translator.InMacro.Pop();

                var syntaxNodes = translator.BuildPort(oldValue.InputsById[v.DeclarationModel.VariableName]);
                translator.InMacro.Push(oldValue);
                foreach (var syntaxNode in syntaxNodes)
                {
                    yield return(syntaxNode);
                }
                yield break;
            }

            switch (v.DeclarationModel.VariableType)
            {
            case VariableType.FunctionVariable:
            case VariableType.GraphVariable:
            case VariableType.ComponentQueryField:
                yield return(RoslynBuilder.LocalVariableReference(v.DeclarationModel.Name));

                break;

            case VariableType.FunctionParameter:
                yield return(RoslynBuilder.ArgumentReference(v.DeclarationModel.Name));

                break;

//                case VariableType.Literal:
//                case VariableType.InlineExpression:
            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Пример #5
0
        void TestExtractMacro(IEnumerable <IGraphElementModel> toExtract, IO inputs, IO outputs)
        {
            MacroRefNodeModel macroRef = GraphModel.ExtractNodesAsMacro(m_MacroGraphModel, Vector2.zero, toExtract);

            Assert.That(macroRef.GraphAssetModel.GraphModel, Is.EqualTo(m_MacroGraphModel));

            inputs.Check(m_MacroGraphModel, macroRef.InputVariablePorts.ToList(), ModifierFlags.ReadOnly);
            outputs.Check(m_MacroGraphModel, macroRef.OutputVariablePorts.ToList(), ModifierFlags.WriteOnly);

            CompilationResult compilationResult = GraphModel.Compile(AssemblyType.None, GraphModel.CreateTranslator(), CompilationOptions.Default);

            Assert.That(
                compilationResult.status,
                Is.EqualTo(CompilationStatus.Succeeded));
            Debug.Log(compilationResult.sourceCode[0]);
        }
 public static GraphElement CreateMacro(this INodeBuilder builder, Store store, MacroRefNodeModel model)
 {
     return(new MacroNode(model, store, builder.GraphView));
 }