public JsFunctionDefinitionExpression CompileAutoEventRemover(IEvent @event, EventScriptSemantics impl, string backingFieldName) { try { CreateCompilationContext(null, null, null); string valueName = _namer.GetVariableName(@event.RemoveAccessor.Parameters[0].Name, new HashSet <string>(@event.DeclaringTypeDefinition.TypeParameters.Select(p => _namer.GetTypeParameterName(p)))); CreateCompilationContext(null, null, null); JsExpression target; string[] args; if (@event.IsStatic) { target = _runtimeLibrary.GetScriptType(@event.DeclaringType, TypeContext.UseStaticMember); args = new[] { valueName }; } else if (impl.RemoveMethod.Type == MethodScriptSemantics.ImplType.StaticMethodWithThisAsFirstArgument) { target = JsExpression.Identifier(_namer.ThisAlias); args = new[] { _namer.ThisAlias, valueName }; } else { target = JsExpression.This; args = new[] { valueName }; } var bfAccessor = JsExpression.MemberAccess(target, backingFieldName); var combineCall = _statementCompiler.CompileDelegateRemoveCall(@event.RemoveAccessor.Region, bfAccessor, JsExpression.Identifier(valueName)); return(JsExpression.FunctionDefinition(args, new JsBlockStatement(new JsExpressionStatement(JsExpression.Assign(bfAccessor, combineCall))))); } catch (Exception ex) { _errorReporter.Region = @event.Region; _errorReporter.InternalError(ex); return(JsExpression.FunctionDefinition(new string[0], JsBlockStatement.EmptyStatement)); } }
public void InstanceManualEventsWithAddRemoveMethodsWithNoCodeAreCorrectlyImported() { var metadataImporter = new MockMetadataImporter { GetConstructorSemantics = c => ConstructorScriptSemantics.Unnamed(skipInInitializer: c.DeclaringType.IsKnownType(KnownTypeCode.Object)), GetEventSemantics = f => EventScriptSemantics.AddAndRemoveMethods(MethodScriptSemantics.NormalMethod("add_" + f.Name, generateCode: false), MethodScriptSemantics.NormalMethod("remove_" + f.Name, generateCode: false)) }; Compile(new[] { "class C { public event System.EventHandler SomeProp { add {} remove{} } }" }, metadataImporter: metadataImporter); FindClass("C").InstanceMethods.Should().BeEmpty(); FindClass("C").UnnamedConstructor.Body.Statements.Should().BeEmpty(); }
private void CompileAndAddAutoEventMethodsToType(JsClass jsClass, EventDeclaration node, IEvent evt, EventScriptSemantics options, string backingFieldName) { if (options.AddMethod != null && options.AddMethod.GeneratedMethodName != null) { var compiled = CreateMethodCompiler().CompileAutoEventAdder(evt, options, backingFieldName); AddCompiledMethodToType(jsClass, evt.AddAccessor, options.AddMethod, new JsMethod(evt.AddAccessor, options.AddMethod.GeneratedMethodName, new string[0], compiled)); } if (options.RemoveMethod != null && options.RemoveMethod.GeneratedMethodName != null) { var compiled = CreateMethodCompiler().CompileAutoEventRemover(evt, options, backingFieldName); AddCompiledMethodToType(jsClass, evt.RemoveAccessor, options.RemoveMethod, new JsMethod(evt.RemoveAccessor, options.RemoveMethod.GeneratedMethodName, new string[0], compiled)); } }
void IMetadataImporter.SetEventSemantics(IEvent evt, EventScriptSemantics semantics) { }
public virtual void SetEventSemantics(IEvent evt, EventScriptSemantics semantics) { _prev.SetEventSemantics(evt, semantics); }