Пример #1
0
        public BurstProblemSubAnalyzerStatus CheckAndAnalyze(IInvocationExpression invocationExpression, IHighlightingConsumer consumer)
        {
            var invokedMethod = invocationExpression.Reference.Resolve().DeclaredElement as IMethod;

            if (!BurstCodeAnalysisUtil.IsSharedStaticCreateMethod(invokedMethod))
            {
                return(BurstProblemSubAnalyzerStatus.NO_WARNING_CONTINUE);
            }

            if (invokedMethod.TypeParameters.Count != 0)
            {
                return(BurstProblemSubAnalyzerStatus.NO_WARNING_STOP);
            }

            var methodParameters = invokedMethod.Parameters;

            for (var index = 0; index < methodParameters.Count - 1; index++)
            {
                if (!methodParameters[index].Type.IsSystemType())
                {
                    return(BurstProblemSubAnalyzerStatus.NO_WARNING_STOP);
                }
            }

            consumer?.AddHighlighting(new BurstSharedStaticCreateWarning(invocationExpression));

            return(BurstProblemSubAnalyzerStatus.WARNING_PLACED_STOP);
        }
Пример #2
0
        protected override void Analyze(IInvocationExpression invocationExpression, IDaemonProcess daemonProcess,
                                        DaemonProcessKind kind, IHighlightingConsumer consumer)
        {
            var invokedMethod = invocationExpression.Reference.Resolve().DeclaredElement as IMethod;

            if (!BurstCodeAnalysisUtil.IsSharedStaticCreateMethod(invokedMethod))
            {
                return;
            }

            var substitution       = invocationExpression.Reference.Resolve().Substitution;
            var domain             = substitution.Domain;
            var sharedStaticDomain = domain.Where(parameter =>
                                                  parameter.OwnerType is IStruct @struct && @struct.GetClrName().Equals(KnownTypes.SharedStatic))
                                     .ToList();

            Assertion.Assert(sharedStaticDomain.Count == 1, "SharedStatic should have 1 substitution");

            if (sharedStaticDomain.Count != 1)
            {
                return;
            }

            var typeParameter = sharedStaticDomain[0];

            // it means Burst finally supported type parameter unmanaged constraint
            Assertion.Assert(!typeParameter.IsUnmanagedType, "SharedStatic doesn't have unmanaged constraint");

            if (!typeParameter.IsValid() || typeParameter.IsUnmanagedType)
            {
                return;
            }

            var substitutedType = substitution.Apply(typeParameter);

            if (substitutedType.IsUnmanagedType(invocationExpression.GetLanguageVersion()))
            {
                return;
            }

            var typeParameterName = substitutedType.GetTypeElement()?.ShortName;

            if (typeParameterName != null)
            {
                consumer.AddHighlighting(new SharedStaticUnmanagedTypeWarning(invocationExpression, typeParameterName));
            }
        }