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); }
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)); } }