public Value Method(MethodReference methodReference, Value[] parameters) { // built-in shader method var methodInfo = methodReference.GetMethodInfo(); var shaderAttributes = methodInfo.GetCustomAttributes <ShaderAttribute>(); string pattern = null; if (shaderAttributes.Any()) { pattern = shaderAttributes.First().pattern; } var md = methodReference.Resolve(); TypeReference returnType = md.ReturnType; if (md.IsConstructor) { var parameterPatterns = new List <string>(); for (int i = 0; i < md.Parameters.Count; i++) { parameterPatterns.Add(string.Format("{{{0}}}", i)); } pattern = Format("{0}({1})", md.DeclaringType, Join(", ", parameterPatterns)); returnType = md.DeclaringType; } if (pattern != null) { return(new Value(returnType, Format(pattern, parameters))); } var callerDeclaringType = methodDefinition.DeclaringType; var calleeDeclaringType = methodReference.DeclaringType.Resolve(); if (calleeDeclaringType.IsBaseOf(callerDeclaringType) || calleeDeclaringType == callerDeclaringType) { string methodName = Format("{0}_{1}", callerDeclaringType.Name, methodReference.Resolve().Name); methods[methodName] = methodReference.Resolve(); return(new Value(typeof(void).GetTypeDefinition(), Format("{0}();", methodName))); } Debug.LogErrorFormat("Method \"{0}.{1}\" is not a built-in shader method.", methodInfo.DeclaringType.FullName, methodInfo.Name); return(null); }