public override void Populate(CSharpGeneratorContext context) { var typeElement = context.ClassDeclaration.DeclaredElement as IClass; if (typeElement == null) { return; } if (!MonoBehaviourUtil.IsMonoBehaviourType(typeElement, context.PsiModule)) { return; } var existingEventNames = typeElement.Methods.Select(m => m.ShortName).ToHashSet(); var missingEvents = MonoBehaviourUtil.Events.Where(e => !existingEventNames.Contains(e.Name)); var factory = CSharpElementFactory.GetInstance(context.ClassDeclaration); foreach (var missingEvent in missingEvents) { var method = CreateDeclaration(missingEvent, factory, context.ClassDeclaration).DeclaredElement; if (method != null) { context.ProvidedElements.Add(new GeneratorDeclaredElement <IMethod>(method)); } } }
protected override void Process(CSharpGeneratorContext context, IProgressIndicator progress) { var typeElement = context.ClassDeclaration.DeclaredElement as IClass; if (typeElement == null) { return; } if (!MonoBehaviourUtil.IsMonoBehaviourType(typeElement, context.PsiModule)) { return; } var selectedMethods = context.InputElements.OfType <GeneratorDeclaredElement <IMethod> >(); var factory = CSharpElementFactory.GetInstance(context.ClassDeclaration); foreach (var selectedMethod in selectedMethods) { ISubstitution newSubstitution; var method = (IMethodDeclaration)CSharpGenerateUtil.CreateMemberDeclaration( context.ClassDeclaration, selectedMethod.Substitution, selectedMethod.DeclaredElement, false, out newSubstitution); method.SetBody(factory.CreateEmptyBlock()); method.FormatNode(); context.PutMemberDeclaration(method); } }
public void Check(IDeclaration declaration, INamingPolicyProvider namingPolicyProvider, out bool isFinalResult, out NamingConsistencyCheckResult result) { var methodDeclaration = declaration as IMethodDeclaration; if (methodDeclaration != null && MonoBehaviourUtil.IsEventHandler(methodDeclaration.DeclaredName)) { var containingTypeElement = methodDeclaration.GetContainingTypeDeclaration().DeclaredElement; if (containingTypeElement != null && MonoBehaviourUtil.IsMonoBehaviourType(containingTypeElement, methodDeclaration.GetPsiModule())) { result = NamingConsistencyCheckResult.OK; isFinalResult = true; return; } } result = null; isFinalResult = false; }
public bool SuppressUsageInspectionsOnElement(IDeclaredElement element, out ImplicitUseKindFlags flags) { // TODO: Only do any work if the element belongs to a project that references Unity.Engine var cls = element as IClass; if (cls != null) { if (MonoBehaviourUtil.IsMonoBehaviourType(cls, cls.Module)) { flags = ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature; return(true); } } var method = element as IMethod; if (method != null && MonoBehaviourUtil.IsEventHandler(method.ShortName)) { var containingType = method.GetContainingType(); if (containingType != null && MonoBehaviourUtil.IsMonoBehaviourType(containingType, method.Module)) { flags = ImplicitUseKindFlags.Access; return(true); } } var field = element as IField; if (field != null && field.GetAccessRights() == AccessRights.PUBLIC) { var containingType = field.GetContainingType(); if (containingType != null && MonoBehaviourUtil.IsMonoBehaviourType(containingType, field.Module)) { // Public fields gets exposed to the Unity Editor and assigned from the UI. But it still should be checked if the field is ever accessed from the code. flags = ImplicitUseKindFlags.Assign; return(true); } } flags = ImplicitUseKindFlags.Default; return(false); }