From ad3ab6374071be1a5e249e32c67559b8534b73d0 Mon Sep 17 00:00:00 2001 From: Natsuneko Date: Sun, 30 May 2021 11:45:56 +0900 Subject: [PATCH 01/14] Support User-Defined Properties --- .../UdonSharp/Editor/UdonSharpASTVisitor.cs | 230 +++++++++++++++++- Assets/UdonSharp/Editor/UdonSharpClass.cs | 1 + .../UdonSharp/Editor/UdonSharpClassVisitor.cs | 15 ++ .../Editor/UdonSharpCompilationModule.cs | 20 +- .../Editor/UdonSharpExpressionCapture.cs | 152 ++++++++++++ Assets/UdonSharp/Editor/UdonSharpProperty.cs | 53 ++++ .../Editor/UdonSharpProperty.cs.meta | 11 + .../Editor/UdonSharpPropertyVisitor.cs | 124 ++++++++++ .../Editor/UdonSharpPropertyVisitor.cs.meta | 11 + .../UdonSharp/Editor/UdonSharpSymbolTable.cs | 5 + 10 files changed, 619 insertions(+), 3 deletions(-) create mode 100644 Assets/UdonSharp/Editor/UdonSharpProperty.cs create mode 100644 Assets/UdonSharp/Editor/UdonSharpProperty.cs.meta create mode 100644 Assets/UdonSharp/Editor/UdonSharpPropertyVisitor.cs create mode 100644 Assets/UdonSharp/Editor/UdonSharpPropertyVisitor.cs.meta diff --git a/Assets/UdonSharp/Editor/UdonSharpASTVisitor.cs b/Assets/UdonSharp/Editor/UdonSharpASTVisitor.cs index 7c878334..b2f1b26d 100644 --- a/Assets/UdonSharp/Editor/UdonSharpASTVisitor.cs +++ b/Assets/UdonSharp/Editor/UdonSharpASTVisitor.cs @@ -25,6 +25,8 @@ public class ASTVisitorContext public List definedMethods; + public List definedProperties; + // Tracking labels for the current function and flow control public JumpLabel returnLabel = null; public SymbolDefinition returnJumpTarget = null; @@ -118,11 +120,12 @@ public SymbolDefinition requestedDestination /// public class ASTVisitor : UdonSharpSyntaxWalker { - public ASTVisitor(ResolverContext resolver, SymbolTable rootTable, LabelTable labelTable, List methodDefinitions, List externUserClassDefinitions, ClassDebugInfo debugInfo) + public ASTVisitor(ResolverContext resolver, SymbolTable rootTable, LabelTable labelTable, List methodDefinitions, List propertyDefinitions, List externUserClassDefinitions, ClassDebugInfo debugInfo) : base(resolver, rootTable, labelTable, debugInfo) { visitorContext.returnJumpTarget = rootTable.CreateNamedSymbol("returnTarget", typeof(uint), SymbolDeclTypeFlags.Internal); visitorContext.definedMethods = methodDefinitions; + visitorContext.definedProperties = propertyDefinitions; visitorContext.externClassDefinitions = externUserClassDefinitions; } @@ -365,7 +368,230 @@ public override void VisitPropertyDeclaration(PropertyDeclarationSyntax node) { UpdateSyntaxNode(node); - throw new System.NotSupportedException("User property declarations are not yet supported by UdonSharp"); + System.Type propertyType = null; + + using (ExpressionCaptureScope propertyTypeScope = new ExpressionCaptureScope(visitorContext, null)) + { + Visit(node.Type); + propertyType = propertyTypeScope.captureType; + } + + if (node.Modifiers.HasModifier("static")) + throw new System.NotSupportedException("UdonSharp does not currently support static user-defined property declarations"); + + PropertyDefinition definition = visitorContext.definedProperties.Where(e => e.originalPropertyName == node.Identifier.ValueText).First(); + + if (definition.getter != null) + { + var getter = definition.getter; + + if ((node.Modifiers.HasModifier("public") && getter.declarationFlags == PropertyDeclFlags.None) || getter.declarationFlags == PropertyDeclFlags.Public) + { + visitorContext.uasmBuilder.AppendLine($".export {getter.accessorName}", 1); + visitorContext.uasmBuilder.AppendLine(""); + } + + visitorContext.uasmBuilder.AppendLine($"{getter.accessorName}:", 1); + visitorContext.uasmBuilder.AppendLine(""); + + Debug.Assert(visitorContext.returnLabel == null, "Return label must be null"); + var returnLabel = visitorContext.labelTable.GetNewJumpLabel("return"); + visitorContext.returnLabel = returnLabel; + visitorContext.returnSymbol = getter.returnSymbol; + + visitorContext.uasmBuilder.AddJumpLabel(getter.entryPoint); + + SymbolDefinition constEndAddrVal = visitorContext.topTable.CreateConstSymbol(typeof(uint), 0xFFFFFFFF); + visitorContext.uasmBuilder.AddPush(constEndAddrVal); + visitorContext.uasmBuilder.AddJumpLabel(getter.userCallStart); + + if (!visitorContext.topTable.IsGlobalSymbolTable) + throw new System.Exception("Parent symbol table for property table must be the global symbol table"); + + var getterNode = node.AccessorList?.Accessors.First(accessor => accessor.Keyword.Kind() == SyntaxKind.GetKeyword); + if (getterNode == null) + { + using (ExpressionCaptureScope expressionBodyCapture = new ExpressionCaptureScope(visitorContext, null)) + { + Visit(node.ExpressionBody); + + if (visitorContext.returnSymbol != null) + { + SymbolDefinition returnValue = expressionBodyCapture.ExecuteGet(); + + using (ExpressionCaptureScope returnSetterScope = new ExpressionCaptureScope(visitorContext, null)) + { + returnSetterScope.SetToLocalSymbol(visitorContext.returnSymbol); + returnSetterScope.ExecuteSet(returnValue); + } + + if (visitorContext.requiresVRCReturn) + { + SymbolTable globalSymbolTable = visitorContext.topTable.GetGlobalSymbolTable(); + SymbolDefinition autoAssignedEventSymbol = globalSymbolTable.FindUserDefinedSymbol("__returnValue"); + + if (autoAssignedEventSymbol == null) + autoAssignedEventSymbol = globalSymbolTable.CreateNamedSymbol("__returnValue", typeof(System.Object), SymbolDeclTypeFlags.Private | SymbolDeclTypeFlags.BuiltinVar); + + using (ExpressionCaptureScope returnValueSetMethod = new ExpressionCaptureScope(visitorContext, null)) + { + returnValueSetMethod.SetToLocalSymbol(autoAssignedEventSymbol); + returnValueSetMethod.ExecuteSet(returnValue); + } + } + } + } + } + else if (getterNode.Body != null) + { + Visit(getterNode.Body); + } + else if (getterNode.ExpressionBody != null) + { + using (ExpressionCaptureScope expressionBodyCapture = new ExpressionCaptureScope(visitorContext, null)) + { + Visit(getterNode.ExpressionBody); + + if (visitorContext.returnSymbol != null) + { + SymbolDefinition returnValue = expressionBodyCapture.ExecuteGet(); + + using (ExpressionCaptureScope returnSetterScope = new ExpressionCaptureScope(visitorContext, null)) + { + returnSetterScope.SetToLocalSymbol(visitorContext.returnSymbol); + returnSetterScope.ExecuteSet(returnValue); + } + + if (visitorContext.requiresVRCReturn) + { + SymbolTable globalSymbolTable = visitorContext.topTable.GetGlobalSymbolTable(); + SymbolDefinition autoAssignedEventSymbol = globalSymbolTable.FindUserDefinedSymbol("__returnValue"); + + if (autoAssignedEventSymbol == null) + autoAssignedEventSymbol = globalSymbolTable.CreateNamedSymbol("__returnValue", typeof(System.Object), SymbolDeclTypeFlags.Private | SymbolDeclTypeFlags.BuiltinVar); + + using (ExpressionCaptureScope returnValueSetMethod = new ExpressionCaptureScope(visitorContext, null)) + { + returnValueSetMethod.SetToLocalSymbol(autoAssignedEventSymbol); + returnValueSetMethod.ExecuteSet(returnValue); + } + } + } + } + } + else if (getterNode.Body == null) + { + SymbolTable backingField = new SymbolTable(visitorContext.resolverContext, visitorContext.topTable); + backingField.symbolDefinitions.Add(getter.backingField.fieldSymbol); + visitorContext.PushTable(backingField); + + SymbolDefinition returnValue = getter.backingField.fieldSymbol; + + using (ExpressionCaptureScope returnSetterScope = new ExpressionCaptureScope(visitorContext, null)) + { + returnSetterScope.SetToLocalSymbol(visitorContext.returnSymbol); + returnSetterScope.ExecuteSet(returnValue); + } + + if (visitorContext.requiresVRCReturn) + { + SymbolTable globalSymbolTable = visitorContext.topTable.GetGlobalSymbolTable(); + SymbolDefinition autoAssignedEventSymbol = globalSymbolTable.FindUserDefinedSymbol("__returnValue"); + + if (autoAssignedEventSymbol == null) + autoAssignedEventSymbol = globalSymbolTable.CreateNamedSymbol("__returnValue", typeof(System.Object), SymbolDeclTypeFlags.Private | SymbolDeclTypeFlags.BuiltinVar); + + using (ExpressionCaptureScope returnValueSetMethod = new ExpressionCaptureScope(visitorContext, null)) + { + returnValueSetMethod.SetToLocalSymbol(autoAssignedEventSymbol); + returnValueSetMethod.ExecuteSet(returnValue); + } + } + + + visitorContext.topTable.FlattenTableCountersToGlobal(); + visitorContext.PopTable(); + } + + visitorContext.topTable.FlattenTableCountersToGlobal(); + + visitorContext.uasmBuilder.AddJumpLabel(returnLabel); + visitorContext.uasmBuilder.AddJumpLabel(getter.returnPoint); + visitorContext.uasmBuilder.AddReturnSequence(visitorContext.returnJumpTarget, "Property epilogue"); + + visitorContext.uasmBuilder.AppendLine(""); + + visitorContext.returnLabel = null; + } + + if (definition.setter != null) + { + var setter = definition.setter; + + if ((node.Modifiers.HasModifier("public") && setter.declarationFlags == PropertyDeclFlags.None) || setter.declarationFlags == PropertyDeclFlags.Public) + { + visitorContext.uasmBuilder.AppendLine($".export {setter.accessorName}", 1); + visitorContext.uasmBuilder.AppendLine(""); + } + + visitorContext.uasmBuilder.AppendLine($"{setter.accessorName}:", 1); + visitorContext.uasmBuilder.AppendLine(""); + + Debug.Assert(visitorContext.returnLabel == null, "Return label must be null"); + var returnLabel = visitorContext.labelTable.GetNewJumpLabel("return"); + visitorContext.returnLabel = returnLabel; + + visitorContext.uasmBuilder.AddJumpLabel(setter.entryPoint); + + SymbolDefinition constEndAddrVal = visitorContext.topTable.CreateConstSymbol(typeof(uint), 0xFFFFFFFF); + visitorContext.uasmBuilder.AddPush(constEndAddrVal); + visitorContext.uasmBuilder.AddJumpLabel(setter.userCallStart); + + if (!visitorContext.topTable.IsGlobalSymbolTable) + throw new System.Exception("Parent symbol table for property table must be the global symbol table"); + + SymbolTable functionSymbolTable = new SymbolTable(visitorContext.resolverContext, visitorContext.topTable); + functionSymbolTable.symbolDefinitions.Add(setter.paramSymbol); + + visitorContext.PushTable(functionSymbolTable); + + var setterNode = node.AccessorList?.Accessors.First(accessor => accessor.Keyword.Kind() == SyntaxKind.SetKeyword); + if (setterNode.Body != null) + { + Visit(setterNode.Body); + } + else if (setterNode.ExpressionBody != null) + { + Visit(setterNode.ExpressionBody); + } + else + { + SymbolTable backingField = new SymbolTable(visitorContext.resolverContext, visitorContext.topTable); + backingField.symbolDefinitions.Add(setter.backingField.fieldSymbol); + visitorContext.PushTable(backingField); + + // _k_BackingField = value; + visitorContext.uasmBuilder.AddPush(setter.paramSymbol); + visitorContext.uasmBuilder.AddPush(setter.backingField.fieldSymbol); + visitorContext.uasmBuilder.AddCopy(); + + visitorContext.topTable.FlattenTableCountersToGlobal(); + visitorContext.PopTable(); + } + + visitorContext.topTable.FlattenTableCountersToGlobal(); + visitorContext.PopTable(); + + visitorContext.uasmBuilder.AddJumpLabel(returnLabel); + visitorContext.uasmBuilder.AddJumpLabel(setter.returnPoint); + visitorContext.uasmBuilder.AddReturnSequence(visitorContext.returnJumpTarget, "Property epilogue"); + + visitorContext.uasmBuilder.AppendLine(""); + + visitorContext.returnLabel = null; + } + + // throw new System.NotSupportedException("User property declarations are not yet supported by UdonSharp"); } public override void VisitBaseExpression(BaseExpressionSyntax node) diff --git a/Assets/UdonSharp/Editor/UdonSharpClass.cs b/Assets/UdonSharp/Editor/UdonSharpClass.cs index 0f36586c..cd96380d 100644 --- a/Assets/UdonSharp/Editor/UdonSharpClass.cs +++ b/Assets/UdonSharp/Editor/UdonSharpClass.cs @@ -56,5 +56,6 @@ public class ClassDefinition public List fieldDefinitions = new List(); public List methodDefinitions = new List(); + public List propertyDefinitions = new List(); } } \ No newline at end of file diff --git a/Assets/UdonSharp/Editor/UdonSharpClassVisitor.cs b/Assets/UdonSharp/Editor/UdonSharpClassVisitor.cs index 01619359..aa5912c9 100644 --- a/Assets/UdonSharp/Editor/UdonSharpClassVisitor.cs +++ b/Assets/UdonSharp/Editor/UdonSharpClassVisitor.cs @@ -11,6 +11,7 @@ public class ClassVisitor : UdonSharpSyntaxWalker { public ClassDefinition classDefinition { get; private set; } private MethodVisitor methodVisitor; + private PropertyVisitor propertyVisitor; private int classCount = 0; @@ -18,6 +19,7 @@ public ClassVisitor(ResolverContext resolver, SymbolTable rootTable, LabelTable : base(UdonSharpSyntaxWalkerDepth.ClassDefinitions, resolver, rootTable, labelTable) { methodVisitor = new MethodVisitor(resolver, rootTable, labelTable); + propertyVisitor = new PropertyVisitor(resolver, rootTable, labelTable); classDefinition = new ClassDefinition(); } @@ -39,6 +41,19 @@ public override void VisitCompilationUnit(CompilationUnitSyntax node) classDefinition.methodDefinitions = methodVisitor.definedMethods; + try + { + propertyVisitor.Visit(node); + } + catch (System.Exception e) + { + visitorContext.currentNode = propertyVisitor.visitorContext.currentNode; + + throw e; + } + + classDefinition.propertyDefinitions = propertyVisitor.definedProperties; + if (classCount == 0) throw new System.Exception($"No UdonSharpBehaviour class found in script file, you must define an UdonSharpBehaviour class in a script referenced by an UdonSharpProgramAsset"); } diff --git a/Assets/UdonSharp/Editor/UdonSharpCompilationModule.cs b/Assets/UdonSharp/Editor/UdonSharpCompilationModule.cs index d6a11911..d07f0620 100644 --- a/Assets/UdonSharp/Editor/UdonSharpCompilationModule.cs +++ b/Assets/UdonSharp/Editor/UdonSharpCompilationModule.cs @@ -122,7 +122,25 @@ public CompileTaskResult Compile(List classDefinitions, Microso if (ErrorCount > 0) return result; - ASTVisitor visitor = new ASTVisitor(resolver, moduleSymbols, moduleLabels, methodVisitor.definedMethods, classDefinitions, debugInfo); + PropertyVisitor propertyVisitor = new PropertyVisitor(resolver, moduleSymbols, moduleLabels); + + try + { + propertyVisitor.Visit(syntaxTree.GetRoot()); + } + catch (System.Exception e) + { + LogException(result, e, propertyVisitor.visitorContext.currentNode, out string logMessage); + + programAsset.compileErrors.Add(logMessage); + + ErrorCount++; + } + + if (ErrorCount > 0) + return result; + + ASTVisitor visitor = new ASTVisitor(resolver, moduleSymbols, moduleLabels, methodVisitor.definedMethods, propertyVisitor.definedProperties, classDefinitions, debugInfo); try { diff --git a/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs b/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs index 28f074cc..30a4e733 100644 --- a/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs +++ b/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs @@ -23,6 +23,8 @@ public enum ExpressionCaptureArchetype ExternUserField, ExternUserMethod, InternalUdonSharpMethod, + LocalProperty, + ExternUserProperty, } /// @@ -53,8 +55,10 @@ public class ExpressionCaptureScope : System.IDisposable public System.Type captureType { get; private set; } = null; public string captureEnum { get; private set; } = ""; public MethodDefinition captureLocalMethod { get; private set; } = null; + public PropertyDefinition captureLocalProperty { get; private set; } = null; public FieldDefinition captureExternUserField { get; private set; } = null; public MethodDefinition captureExternUserMethod { get; private set; } = null; + public PropertyDefinition captureExternUserProperty { get; private set; } = null; public InternalMethodHandler InternalMethodHandler { get; private set; } = null; // In some cases, we know ahead of time that we want to store a particular value in a particular symbol. @@ -455,6 +459,50 @@ public SymbolDefinition ExecuteGet() visitorContext.uasmBuilder.AddPush(outSymbol); visitorContext.uasmBuilder.AddExternCall(methodUdonString); } + else if (captureArchetype == ExpressionCaptureArchetype.LocalProperty) + { + PropertyDefinition definition = captureLocalProperty; + + GetterDefinition getter = definition.getter; + if (getter.type == typeof(void)) + throw new System.TypeLoadException("Cannot return type of void from a get statement"); + + SymbolDefinition exitJumpLocation = visitorContext.topTable.CreateNamedSymbol("exitJumpLoc", typeof(uint), SymbolDeclTypeFlags.Internal | SymbolDeclTypeFlags.Constant); + + visitorContext.uasmBuilder.AddPush(exitJumpLocation); + visitorContext.uasmBuilder.AddJump(getter.userCallStart); + + JumpLabel exitLabel = visitorContext.labelTable.GetNewJumpLabel("returnLocation"); + + visitorContext.uasmBuilder.AddJumpLabel(exitLabel); + exitJumpLocation.symbolDefaultValue = exitLabel.resolvedAddress; + + outSymbol = getter.returnSymbol; + } + else if (captureArchetype == ExpressionCaptureArchetype.ExternUserProperty) + { + PropertyDefinition definition = captureExternUserProperty; + + GetterDefinition getter = definition.getter; + if (getter.type == typeof(void)) + throw new System.TypeLoadException("Cannot return type of void from a get statement"); + + using (ExpressionCaptureScope getPropertyMethodScope = new ExpressionCaptureScope(visitorContext, null, requestedDestination)) + { + getPropertyMethodScope.SetToLocalSymbol(accessSymbol); + getPropertyMethodScope.ResolveAccessToken("SendCustomEvent"); + getPropertyMethodScope.Invoke(new SymbolDefinition[] { visitorContext.topTable.CreateConstSymbol(typeof(string), getter.accessorName) }); + } + + using (ExpressionCaptureScope getReturnScope = new ExpressionCaptureScope(visitorContext, null)) + { + getReturnScope.SetToLocalSymbol(accessSymbol); + getReturnScope.ResolveAccessToken("GetProgramVariable"); + + outSymbol = getReturnScope.Invoke(new SymbolDefinition[] { visitorContext.topTable.CreateConstSymbol(typeof(string), getter.returnSymbol.symbolUniqueName) }); + outSymbol = CastSymbolToType(outSymbol, getter.type, true, true, outSymbol == requestedDestination ? requestedDestination : null); + } + } else if (captureArchetype == ExpressionCaptureArchetype.Field) { outSymbol = AllocateOutputSymbol(captureField.FieldType); @@ -619,6 +667,50 @@ public void ExecuteSet(SymbolDefinition value, bool explicitCast = false) visitorContext.uasmBuilder.AddPush(convertedValue); visitorContext.uasmBuilder.AddExternCall(udonMethodString); + + JumpLabel exitLabel = visitorContext.labelTable.GetNewJumpLabel("returnLocation"); + visitorContext.uasmBuilder.AddJumpLabel(exitLabel); + + } + else if (captureArchetype == ExpressionCaptureArchetype.LocalProperty) + { + PropertyDefinition definition = captureLocalProperty; + SetterDefinition setter = definition.setter; + + using (ExpressionCaptureScope argAssignmentScope = new ExpressionCaptureScope(visitorContext, null)) + { + argAssignmentScope.SetToLocalSymbol(setter.paramSymbol); + argAssignmentScope.ExecuteSet(convertedValue); + } + + SymbolDefinition exitJumpLocation = visitorContext.topTable.CreateNamedSymbol("exitJumpLoc", typeof(uint), SymbolDeclTypeFlags.Internal | SymbolDeclTypeFlags.Constant); + + visitorContext.uasmBuilder.AddPush(exitJumpLocation); + visitorContext.uasmBuilder.AddJump(setter.userCallStart); + JumpLabel exitLabel = visitorContext.labelTable.GetNewJumpLabel("returnLocation"); + + visitorContext.uasmBuilder.AddJumpLabel(exitLabel); + exitJumpLocation.symbolDefaultValue = exitLabel.resolvedAddress; + } + else if (captureArchetype == ExpressionCaptureArchetype.ExternUserProperty) + { + PropertyDefinition definition = captureExternUserProperty; + SetterDefinition setter = definition.setter; + + using (ExpressionCaptureScope argAssignmentScope = new ExpressionCaptureScope(visitorContext, null)) + { + argAssignmentScope.SetToLocalSymbol(accessSymbol); + argAssignmentScope.ResolveAccessToken("SetProgramVariable"); + + argAssignmentScope.Invoke(new SymbolDefinition[] { visitorContext.topTable.CreateConstSymbol(typeof(string), setter.paramSymbol.symbolUniqueName), convertedValue }); + } + + using (ExpressionCaptureScope setPropertyMethodScope = new ExpressionCaptureScope(visitorContext, null)) + { + setPropertyMethodScope.SetToLocalSymbol(accessSymbol); + setPropertyMethodScope.ResolveAccessToken("SendCustomEvent"); + setPropertyMethodScope.Invoke(new SymbolDefinition[] { visitorContext.topTable.CreateConstSymbol(typeof(string), setter.accessorName) }); + } } else if (captureArchetype == ExpressionCaptureArchetype.Field) { @@ -2103,6 +2195,14 @@ public System.Type GetReturnType(bool getUserType = false) { return captureProperty.GetGetMethod().ReturnType; } + else if (captureArchetype == ExpressionCaptureArchetype.LocalProperty) + { + return captureLocalProperty.type; + } + else if (captureArchetype == ExpressionCaptureArchetype.ExternUserProperty) + { + return captureExternUserProperty.type; + } else if (captureArchetype == ExpressionCaptureArchetype.Field) { return captureField.FieldType; @@ -2192,6 +2292,7 @@ public bool ResolveAccessToken(string accessToken) { resolvedToken = HandleLocalSymbolLookup(accessToken) || HandleLocalMethodLookup(accessToken) || + HandleLocalPropertyLookup(accessToken) || HandleLocalUdonBehaviourMethodLookup(accessToken) || HandleLocalUdonBehaviourPropertyLookup(accessToken) || HandleUdonSharpInternalMethodLookup(accessToken); @@ -2200,6 +2301,7 @@ public bool ResolveAccessToken(string accessToken) { resolvedToken = HandleLocalSymbolLookup(accessToken) || HandleLocalMethodLookup(accessToken) || + HandleLocalPropertyLookup(accessToken) || HandleLocalUdonBehaviourMethodLookup(accessToken) || HandleLocalUdonBehaviourPropertyLookup(accessToken) || HandleUdonSharpInternalMethodLookup(accessToken) || @@ -2234,6 +2336,7 @@ public bool ResolveAccessToken(string accessToken) { resolvedToken = HandleExternUserFieldLookup(accessToken) || HandleExternUserMethodLookup(accessToken) || + HandleExternUserPropertyLookup(accessToken) || HandleUdonSharpInternalMethodLookup(accessToken) || HandleMemberPropertyAccess(accessToken) || HandleMemberFieldAccess(accessToken) || @@ -2303,6 +2406,31 @@ private bool HandleLocalMethodLookup(string localMethodName) return true; } + + private bool HandleLocalPropertyLookup(string localPropertyName) + { + if (visitorContext.definedMethods == null) + return false; + + PropertyDefinition foundProperty = null; + + foreach (PropertyDefinition propertyDefinition in visitorContext.definedProperties) + { + if (propertyDefinition.originalPropertyName == localPropertyName) + { + foundProperty = propertyDefinition; + break; + } + } + + if (foundProperty == null) + return false; + + captureArchetype = ExpressionCaptureArchetype.LocalProperty; + captureLocalProperty = foundProperty; + + return true; + } private MethodInfo[] GetTypeMethods(System.Type type, BindingFlags bindingFlags) { @@ -2679,6 +2807,30 @@ private bool HandleExternUserMethodLookup(string methodToken) return true; } + private bool HandleExternUserPropertyLookup(string propertyToken) + { + if (accessSymbol == null || !accessSymbol.IsUserDefinedBehaviour()) + return false; + + System.Type returnType = GetReturnType(true); + ClassDefinition externClass = visitorContext.externClassDefinitions.Find(e => e.userClassType == returnType); + + if (externClass == null) + return false; + + PropertyDefinition foundDefinition = externClass.propertyDefinitions.Find(e => e.originalPropertyName == propertyToken && e.declarationFlags.HasFlag(PropertyDeclFlags.Public)); + if (foundDefinition == null) + return false; + + SymbolDefinition newAccessSymbol = ExecuteGet(); + + accessSymbol = newAccessSymbol; + captureArchetype = ExpressionCaptureArchetype.ExternUserProperty; + captureExternUserProperty = foundDefinition; + + return true; + } + private bool HandleUdonSharpInternalMethodLookup(string methodToken) { bool isInternalMethod = InternalMethodHandler.ResolveAccessToken(methodToken); diff --git a/Assets/UdonSharp/Editor/UdonSharpProperty.cs b/Assets/UdonSharp/Editor/UdonSharpProperty.cs new file mode 100644 index 00000000..48a83739 --- /dev/null +++ b/Assets/UdonSharp/Editor/UdonSharpProperty.cs @@ -0,0 +1,53 @@ + +namespace UdonSharp.Compiler +{ + [System.Flags] + public enum PropertyDeclFlags + { + None = 0, + Public = 1, + Private = 2, + } + + public class BackingFieldDefinition + { + public System.Type type; + public string backingFieldName; + public SymbolDefinition fieldSymbol; + } + + public class SetterDefinition + { + public PropertyDeclFlags declarationFlags; + public System.Type type; + public string symbolName; + public SymbolDefinition paramSymbol; + public BackingFieldDefinition backingField; + public string accessorName; + public JumpLabel entryPoint; + public JumpLabel userCallStart; + public JumpLabel returnPoint; + public JumpLabel returnSymbol; + } + + public class GetterDefinition + { + public PropertyDeclFlags declarationFlags; + public System.Type type; + public BackingFieldDefinition backingField; + public string accessorName; + public JumpLabel entryPoint; + public JumpLabel userCallStart; + public JumpLabel returnPoint; + public SymbolDefinition returnSymbol; + } + + public class PropertyDefinition + { + public PropertyDeclFlags declarationFlags; + public System.Type type; + public string originalPropertyName; + public SetterDefinition setter; + public GetterDefinition getter; + } +} \ No newline at end of file diff --git a/Assets/UdonSharp/Editor/UdonSharpProperty.cs.meta b/Assets/UdonSharp/Editor/UdonSharpProperty.cs.meta new file mode 100644 index 00000000..851a81f6 --- /dev/null +++ b/Assets/UdonSharp/Editor/UdonSharpProperty.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 57b1c1ef7659f3547b1970a29722a893 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UdonSharp/Editor/UdonSharpPropertyVisitor.cs b/Assets/UdonSharp/Editor/UdonSharpPropertyVisitor.cs new file mode 100644 index 00000000..5280297f --- /dev/null +++ b/Assets/UdonSharp/Editor/UdonSharpPropertyVisitor.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections.Generic; + +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; + +namespace UdonSharp.Compiler +{ + public class PropertyVisitor : UdonSharpSyntaxWalker + { + public List definedProperties = new List(); + + public PropertyVisitor(ResolverContext resolver, SymbolTable rootTable, LabelTable labelTable) + : base(UdonSharpSyntaxWalkerDepth.ClassDefinitions, resolver, rootTable, labelTable) { } + + public override void VisitPropertyDeclaration(PropertyDeclarationSyntax node) + { + UpdateSyntaxNode(node); + + PropertyDefinition propertyDefinition = new PropertyDefinition(); + + propertyDefinition.declarationFlags = node.Modifiers.HasModifier("public") ? PropertyDeclFlags.Public : PropertyDeclFlags.Private; + propertyDefinition.originalPropertyName = node.Identifier.Text; + + Type type = null; + + using (ExpressionCaptureScope propertyTypeCapture = new ExpressionCaptureScope(visitorContext, null)) + { + Visit(node.Type); + + type = propertyTypeCapture.captureType; + + if (!visitorContext.resolverContext.IsValidUdonType(type)) + throw new NotSupportedException($"Udon does not support variable of type '{type}' yet"); + } + + BackingFieldDefinition backingField = new BackingFieldDefinition(); + backingField.backingFieldName = $"{node.Identifier.Text}_k_BackingField"; + + backingField.type = type; + propertyDefinition.type = type; + backingField.type = type; + + if (node.AccessorList != null) + { + foreach (AccessorDeclarationSyntax accessor in node.AccessorList.Accessors) + { + bool isSetter = accessor.Keyword.Kind() == SyntaxKind.SetKeyword; + if (isSetter) + { + SetterDefinition setter = new SetterDefinition(); + setter.accessorName = $"set_{node.Identifier.Text}"; + setter.entryPoint = visitorContext.labelTable.GetNewJumpLabel("udonMethodEntryPoint"); + setter.userCallStart = visitorContext.labelTable.GetNewJumpLabel("userMethodCallEntry"); + setter.returnPoint = visitorContext.labelTable.GetNewJumpLabel("methodReturnPoint"); + setter.backingField = (accessor.Body == null && accessor.ExpressionBody == null) ? backingField : null; + setter.type = type; + setter.declarationFlags = GetDeclFlags(accessor); + setter.paramSymbol = visitorContext.topTable.CreateNamedSymbol("value", type, SymbolDeclTypeFlags.Local | SymbolDeclTypeFlags.MethodParameter); + + propertyDefinition.setter = setter; + } + else + { + GetterDefinition getter = new GetterDefinition(); + getter.accessorName = $"get_{node.Identifier.Text}"; + getter.entryPoint = visitorContext.labelTable.GetNewJumpLabel("udonMethodEntryPoint"); + getter.userCallStart = visitorContext.labelTable.GetNewJumpLabel("userMethodCallEntry"); + getter.returnPoint = visitorContext.labelTable.GetNewJumpLabel("methodReturnPoint"); + getter.backingField = (accessor.Body == null && accessor.ExpressionBody == null) ? backingField : null; + getter.type = type; + getter.declarationFlags = GetDeclFlags(accessor); + + using (ExpressionCaptureScope returnTypeCapture = new ExpressionCaptureScope(visitorContext, null)) + { + Visit(node.Type); + + getter.returnSymbol = visitorContext.topTable.CreateNamedSymbol("returnValSymbol", returnTypeCapture.captureType, SymbolDeclTypeFlags.Internal); + } + + propertyDefinition.getter = getter; + } + } + } + else + { + GetterDefinition getter = new GetterDefinition(); + getter.accessorName = $"get_{node.Identifier.Text}"; + getter.entryPoint = visitorContext.labelTable.GetNewJumpLabel("udonMethodEntryPoint"); + getter.userCallStart = visitorContext.labelTable.GetNewJumpLabel("userMethodCallEntry"); + getter.returnPoint = visitorContext.labelTable.GetNewJumpLabel("methodReturnPoint"); + getter.type = type; + getter.declarationFlags = PropertyDeclFlags.Public; + + using (ExpressionCaptureScope returnTypeCapture = new ExpressionCaptureScope(visitorContext, null)) + { + Visit(node.Type); + + getter.returnSymbol = visitorContext.topTable.CreateNamedSymbol("returnValSymbol", returnTypeCapture.captureType, SymbolDeclTypeFlags.Internal); + } + + propertyDefinition.getter = getter; + } + + if (propertyDefinition.setter?.backingField != null || propertyDefinition.getter?.backingField != null) + backingField.fieldSymbol = visitorContext.topTable.CreateNamedSymbol("kBackingField", type, SymbolDeclTypeFlags.Internal | SymbolDeclTypeFlags.PropertyBackingField); + + definedProperties.Add(propertyDefinition); + } + + private PropertyDeclFlags GetDeclFlags(AccessorDeclarationSyntax accessor) + { + if (accessor.Modifiers.Any()) + { + if (accessor.Modifiers.HasModifier("public")) + return PropertyDeclFlags.Public; + + return PropertyDeclFlags.Private; + } + + return PropertyDeclFlags.None; + } + } +} \ No newline at end of file diff --git a/Assets/UdonSharp/Editor/UdonSharpPropertyVisitor.cs.meta b/Assets/UdonSharp/Editor/UdonSharpPropertyVisitor.cs.meta new file mode 100644 index 00000000..3b76eb59 --- /dev/null +++ b/Assets/UdonSharp/Editor/UdonSharpPropertyVisitor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2ec874268bfb3e240a2f7bb6e629de4c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UdonSharp/Editor/UdonSharpSymbolTable.cs b/Assets/UdonSharp/Editor/UdonSharpSymbolTable.cs index b382a854..b9990b3c 100644 --- a/Assets/UdonSharp/Editor/UdonSharpSymbolTable.cs +++ b/Assets/UdonSharp/Editor/UdonSharpSymbolTable.cs @@ -22,6 +22,7 @@ public enum SymbolDeclTypeFlags MethodParameter = 512, // Symbols used for passing around method parameters NeedsRecursivePush = 1024, // Internal symbols used for tracking flow control and such which need to be pushed to the recursive stack when a method is recursive. An example of this is the int counter for a foreach loop and the size of the array the foreach is iterating. BuiltinVar = 2048, + PropertyBackingField = 4096, // Internal symbols used as backing field for user-defined property } [Serializable] @@ -749,6 +750,10 @@ private SymbolDefinition CreateNamedSymbolInternal(string symbolName, System.Typ uniqueSymbolName = $"this_{uniqueSymbolName}"; hasGlobalDeclaration = true; } + if (declType.HasFlag(SymbolDeclTypeFlags.PropertyBackingField)) + { + uniqueSymbolName = $"bf_{uniqueSymbolName}"; + } if (declType.HasFlag(SymbolDeclTypeFlags.Reflection)) { uniqueSymbolName = $"__refl_{uniqueSymbolName}"; From 06ced5eebfdb895cd9a1742078b7a91edbbd51e7 Mon Sep 17 00:00:00 2001 From: Natsuneko Date: Sun, 30 May 2021 13:12:01 +0900 Subject: [PATCH 02/14] Fixed compile error for member access via user-defined properties --- Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs b/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs index 30a4e733..76077ae5 100644 --- a/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs +++ b/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs @@ -2331,6 +2331,7 @@ public bool ResolveAccessToken(string accessToken) captureArchetype == ExpressionCaptureArchetype.Property || captureArchetype == ExpressionCaptureArchetype.Field || captureArchetype == ExpressionCaptureArchetype.ExternUserField || + captureArchetype == ExpressionCaptureArchetype.ExternUserProperty || captureArchetype == ExpressionCaptureArchetype.ArrayIndexer || captureArchetype == ExpressionCaptureArchetype.Enum) { From a70383f5a1c97e02f7ae0774a5a33e13ac0d0311 Mon Sep 17 00:00:00 2001 From: Natsuneko Date: Sun, 30 May 2021 13:30:58 +0900 Subject: [PATCH 03/14] Fixed compile error for member access via local user-defined properties --- Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs b/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs index 76077ae5..2dfb433c 100644 --- a/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs +++ b/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs @@ -2329,6 +2329,7 @@ public bool ResolveAccessToken(string accessToken) // This is where we need to start building intermediate variables to store the input for the next statement else if (captureArchetype == ExpressionCaptureArchetype.LocalSymbol || captureArchetype == ExpressionCaptureArchetype.Property || + captureArchetype == ExpressionCaptureArchetype.LocalProperty || captureArchetype == ExpressionCaptureArchetype.Field || captureArchetype == ExpressionCaptureArchetype.ExternUserField || captureArchetype == ExpressionCaptureArchetype.ExternUserProperty || @@ -2412,7 +2413,7 @@ private bool HandleLocalPropertyLookup(string localPropertyName) { if (visitorContext.definedMethods == null) return false; - + PropertyDefinition foundProperty = null; foreach (PropertyDefinition propertyDefinition in visitorContext.definedProperties) @@ -2427,12 +2428,13 @@ private bool HandleLocalPropertyLookup(string localPropertyName) if (foundProperty == null) return false; + accessSymbol = visitorContext.topTable.CreateThisSymbol(visitorContext.behaviourUserType); captureArchetype = ExpressionCaptureArchetype.LocalProperty; captureLocalProperty = foundProperty; return true; } - + private MethodInfo[] GetTypeMethods(System.Type type, BindingFlags bindingFlags) { MethodInfo[] methods; From 92a2939321c660a72e7a6938e5f572a00807874f Mon Sep 17 00:00:00 2001 From: Natsuneko Date: Sun, 30 May 2021 21:54:20 +0900 Subject: [PATCH 04/14] Fixed what should have check defineProperties field --- Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs b/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs index 2dfb433c..44de956b 100644 --- a/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs +++ b/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs @@ -2411,7 +2411,7 @@ private bool HandleLocalMethodLookup(string localMethodName) private bool HandleLocalPropertyLookup(string localPropertyName) { - if (visitorContext.definedMethods == null) + if (visitorContext.definedProperties == null) return false; PropertyDefinition foundProperty = null; From e003c114481bfd5ed33fc60abf3016dadd6a6a98 Mon Sep 17 00:00:00 2001 From: Natsuneko Date: Sun, 30 May 2021 22:57:03 +0900 Subject: [PATCH 05/14] Changed to throw an exception when trying to access a property that has not been exported --- Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs b/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs index 44de956b..8d11d810 100644 --- a/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs +++ b/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs @@ -677,6 +677,9 @@ public void ExecuteSet(SymbolDefinition value, bool explicitCast = false) PropertyDefinition definition = captureLocalProperty; SetterDefinition setter = definition.setter; + if (setter == null) + throw new System.MemberAccessException($"Property or indexer '{definition.originalPropertyName}' cannot be assigned to -- it is read only or doesn't exist"); + using (ExpressionCaptureScope argAssignmentScope = new ExpressionCaptureScope(visitorContext, null)) { argAssignmentScope.SetToLocalSymbol(setter.paramSymbol); @@ -697,6 +700,9 @@ public void ExecuteSet(SymbolDefinition value, bool explicitCast = false) PropertyDefinition definition = captureExternUserProperty; SetterDefinition setter = definition.setter; + if (setter == null || setter.declarationFlags == PropertyDeclFlags.Private) + throw new System.MemberAccessException($"Property or indexer '{definition.originalPropertyName}' cannot be assigned to -- it is read only or doesn't exist"); + using (ExpressionCaptureScope argAssignmentScope = new ExpressionCaptureScope(visitorContext, null)) { argAssignmentScope.SetToLocalSymbol(accessSymbol); From 1bc16575d8469081bbc066f2f363d554c4a07637 Mon Sep 17 00:00:00 2001 From: Natsuneko Date: Sun, 30 May 2021 22:57:30 +0900 Subject: [PATCH 06/14] Supports array access via user-defined properties --- Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs b/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs index 8d11d810..31324f27 100644 --- a/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs +++ b/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs @@ -2860,6 +2860,8 @@ public void HandleArrayIndexerAccess(SymbolDefinition.COWValue indexerValue, Sym { if (captureArchetype != ExpressionCaptureArchetype.LocalSymbol && captureArchetype != ExpressionCaptureArchetype.Property && + captureArchetype != ExpressionCaptureArchetype.LocalProperty && + captureArchetype != ExpressionCaptureArchetype.ExternUserProperty && !IsField() && captureArchetype != ExpressionCaptureArchetype.ArrayIndexer) { From 63ab803612b2f44b854c2d32f40b97b52b033df4 Mon Sep 17 00:00:00 2001 From: Natsuneko Date: Sun, 30 May 2021 23:40:39 +0900 Subject: [PATCH 07/14] Fixed NullReferenceException in GetReturnType method of property chain --- Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs b/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs index 31324f27..538151c8 100644 --- a/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs +++ b/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs @@ -255,8 +255,10 @@ private void InheritScope(ExpressionCaptureScope childScope) captureEnum = childScope.captureEnum; arrayIndexerIndexValue = childScope.arrayIndexerIndexValue; captureLocalMethod = childScope.captureLocalMethod; + captureLocalProperty = childScope.captureLocalProperty; captureExternUserField = childScope.captureExternUserField; captureExternUserMethod = childScope.captureExternUserMethod; + captureExternUserProperty = childScope.captureExternUserProperty; unresolvedAccessChain = childScope.unresolvedAccessChain; } From 8a954f33993c7d1277a85a464775c28d5ad5b523 Mon Sep 17 00:00:00 2001 From: Natsuneko Date: Mon, 31 May 2021 18:35:32 +0900 Subject: [PATCH 08/14] Throw an exception if a property initializer is declared --- Assets/UdonSharp/Editor/UdonSharpASTVisitor.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Assets/UdonSharp/Editor/UdonSharpASTVisitor.cs b/Assets/UdonSharp/Editor/UdonSharpASTVisitor.cs index b2f1b26d..385631be 100644 --- a/Assets/UdonSharp/Editor/UdonSharpASTVisitor.cs +++ b/Assets/UdonSharp/Editor/UdonSharpASTVisitor.cs @@ -379,6 +379,9 @@ public override void VisitPropertyDeclaration(PropertyDeclarationSyntax node) if (node.Modifiers.HasModifier("static")) throw new System.NotSupportedException("UdonSharp does not currently support static user-defined property declarations"); + if (node.Initializer != null) + throw new System.NotSupportedException("UdonSharp does not currently support initializers on properties."); + PropertyDefinition definition = visitorContext.definedProperties.Where(e => e.originalPropertyName == node.Identifier.ValueText).First(); if (definition.getter != null) From 83274cf154719e9af11dbde82551a1eaf8749b7f Mon Sep 17 00:00:00 2001 From: Natsuneko Date: Mon, 31 May 2021 21:32:30 +0900 Subject: [PATCH 09/14] Support for synchronizing user-defined properties via backing field using [field: UdonSynced] --- Assets/UdonSharp/Editor/UdonSharpProperty.cs | 2 + .../Editor/UdonSharpPropertyVisitor.cs | 51 +++++++++++++++++++ .../UdonSharp/Editor/UdonSharpSyntaxWalker.cs | 2 +- 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/Assets/UdonSharp/Editor/UdonSharpProperty.cs b/Assets/UdonSharp/Editor/UdonSharpProperty.cs index 48a83739..0aacfa69 100644 --- a/Assets/UdonSharp/Editor/UdonSharpProperty.cs +++ b/Assets/UdonSharp/Editor/UdonSharpProperty.cs @@ -12,6 +12,8 @@ public enum PropertyDeclFlags public class BackingFieldDefinition { public System.Type type; + public bool synced; + public UdonSyncMode syncMode; public string backingFieldName; public SymbolDefinition fieldSymbol; } diff --git a/Assets/UdonSharp/Editor/UdonSharpPropertyVisitor.cs b/Assets/UdonSharp/Editor/UdonSharpPropertyVisitor.cs index 5280297f..a1dc73e0 100644 --- a/Assets/UdonSharp/Editor/UdonSharpPropertyVisitor.cs +++ b/Assets/UdonSharp/Editor/UdonSharpPropertyVisitor.cs @@ -37,6 +37,51 @@ public override void VisitPropertyDeclaration(PropertyDeclarationSyntax node) BackingFieldDefinition backingField = new BackingFieldDefinition(); backingField.backingFieldName = $"{node.Identifier.Text}_k_BackingField"; + if (node.AttributeLists != null && node.AttributeLists.Any()) + { + foreach (AttributeListSyntax attributes in node.AttributeLists) + { + foreach (AttributeSyntax attribute in attributes.Attributes) + { + if (attributes.Target.Identifier.Kind() == SyntaxKind.FieldKeyword) + { + using (ExpressionCaptureScope attributeTypeCapture = new ExpressionCaptureScope(visitorContext, null)) + { + attributeTypeCapture.isAttributeCaptureScope = true; + Visit(attribute.Name); + + backingField.synced = true; + + if (attributeTypeCapture.captureType != typeof(UdonSyncedAttribute)) + continue; + + if (attribute.ArgumentList == null || attribute.ArgumentList.Arguments == null || attribute.ArgumentList.Arguments.Count == 0) + { + backingField.syncMode = UdonSyncMode.None; + } + else + { + using (ExpressionCaptureScope attributeCaptureScope = new ExpressionCaptureScope(visitorContext, null)) + { + Visit(attribute.ArgumentList.Arguments[0].Expression); + + if (!attributeCaptureScope.IsEnum()) + throw new Exception("Invalid attribute argument provided for sync"); + + backingField.syncMode = (UdonSyncMode) attributeCaptureScope.GetEnumValue(); + } + } + + break; + } + } + } + + if (backingField.synced) + break; + } + } + backingField.type = type; propertyDefinition.type = type; backingField.type = type; @@ -103,7 +148,13 @@ public override void VisitPropertyDeclaration(PropertyDeclarationSyntax node) } if (propertyDefinition.setter?.backingField != null || propertyDefinition.getter?.backingField != null) + { backingField.fieldSymbol = visitorContext.topTable.CreateNamedSymbol("kBackingField", type, SymbolDeclTypeFlags.Internal | SymbolDeclTypeFlags.PropertyBackingField); + backingField.fieldSymbol.syncMode = backingField.syncMode; + + if (backingField.synced) + VerifySyncValidForType(backingField.type, backingField.fieldSymbol.syncMode); + } definedProperties.Add(propertyDefinition); } diff --git a/Assets/UdonSharp/Editor/UdonSharpSyntaxWalker.cs b/Assets/UdonSharp/Editor/UdonSharpSyntaxWalker.cs index 1e5fedf8..dc3bda1f 100644 --- a/Assets/UdonSharp/Editor/UdonSharpSyntaxWalker.cs +++ b/Assets/UdonSharp/Editor/UdonSharpSyntaxWalker.cs @@ -442,7 +442,7 @@ protected List HandleVariableDeclaration(VariableDeclarationSy return newSymbols; } - private void VerifySyncValidForType(System.Type typeToSync, UdonSyncMode syncMode) + protected void VerifySyncValidForType(System.Type typeToSync, UdonSyncMode syncMode) { if (syncMode == UdonSyncMode.NotSynced) return; From 455e8270803c077f1c21090e6849efa6f847ded9 Mon Sep 17 00:00:00 2001 From: Merlin <36685500+MerlinVR@users.noreply.github.com> Date: Mon, 14 Jun 2021 15:30:19 -0700 Subject: [PATCH 10/14] Add tests for user properties --- .../Tests/IntegrationTestScene.unity | 140 +++++++- .../Tests/TestScripts/Core/PropertyTest.asset | 305 ++++++++++++++++++ .../TestScripts/Core/PropertyTest.asset.meta | 8 + .../Tests/TestScripts/Core/PropertyTest.cs | 109 +++++++ .../TestScripts/Core/PropertyTest.cs.meta | 11 + 5 files changed, 571 insertions(+), 2 deletions(-) create mode 100644 Assets/UdonSharp/Tests/TestScripts/Core/PropertyTest.asset create mode 100644 Assets/UdonSharp/Tests/TestScripts/Core/PropertyTest.asset.meta create mode 100644 Assets/UdonSharp/Tests/TestScripts/Core/PropertyTest.cs create mode 100644 Assets/UdonSharp/Tests/TestScripts/Core/PropertyTest.cs.meta diff --git a/Assets/UdonSharp/Tests/IntegrationTestScene.unity b/Assets/UdonSharp/Tests/IntegrationTestScene.unity index 87e0a326..496f7336 100644 --- a/Assets/UdonSharp/Tests/IntegrationTestScene.unity +++ b/Assets/UdonSharp/Tests/IntegrationTestScene.unity @@ -148,10 +148,11 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 2c1a90bfe6fb6d04b85cd73b37a1936b, type: 2} programSource: {fileID: 11400000, guid: 0bd42492b649fba42a7ad8451d569f89, type: 2} - serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABgMAAAAAAAAAAi8CAAAAAUsAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAUwB5AHMAdABlAG0ALgBCAG8AbwBsAGUAYQBuACwAIABtAHMAYwBvAHIAbABpAGIAXQBdACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgACAAAABgIAAAAAAAAAJwEEAAAAdAB5AHAAZQABFwAAAFMAeQBzAHQAZQBtAC4AUwB0AHIAaQBuAGcALAAgAG0AcwBjAG8AcgBsAGkAYgAnAQoAAABTAHkAbQBiAG8AbABOAGEAbQBlAAEOAAAAcgB1AG4AVABlAHMAdABPAG4AUwB0AGEAcgB0ACcBBAAAAHQAeQBwAGUAARgAAABTAHkAcwB0AGUAbQAuAEIAbwBvAGwAZQBhAG4ALAAgAG0AcwBjAG8AcgBsAGkAYgArAQUAAABWAGEAbAB1AGUAAQcFAi8DAAAAAWIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAVQBuAGkAdAB5AEUAbgBnAGkAbgBlAC4AQwBvAG0AcABvAG4AZQBuAHQAWwBdACwAIABVAG4AaQB0AHkARQBuAGcAaQBuAGUALgBDAG8AcgBlAE0AbwBkAHUAbABlAF0AXQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAwAAAAYCAAAAAAAAACcBBAAAAHQAeQBwAGUAARcAAABTAHkAcwB0AGUAbQAuAFMAdAByAGkAbgBnACwAIABtAHMAYwBvAHIAbABpAGIAJwEKAAAAUwB5AG0AYgBvAGwATgBhAG0AZQABEAAAAGkAbgB0AGUAZwByAGEAdABpAG8AbgBUAGUAcwB0AHMAJwEEAAAAdAB5AHAAZQABLwAAAFUAbgBpAHQAeQBFAG4AZwBpAG4AZQAuAEMAbwBtAHAAbwBuAGUAbgB0AFsAXQAsACAAVQBuAGkAdAB5AEUAbgBnAGkAbgBlAC4AQwBvAHIAZQBNAG8AZAB1AGwAZQABAQUAAABWAGEAbAB1AGUALwQAAAABLwAAAFUAbgBpAHQAeQBFAG4AZwBpAG4AZQAuAEMAbwBtAHAAbwBuAGUAbgB0AFsAXQAsACAAVQBuAGkAdAB5AEUAbgBnAGkAbgBlAC4AQwBvAHIAZQBNAG8AZAB1AGwAZQAEAAAABhEAAAAAAAAADAAAAAAMAQAAAAwCAAAADAMAAAAMBAAAAAwFAAAADAYAAAAMBwAAAAwIAAAADAkAAAAMCgAAAAwLAAAADAwAAAAMDQAAAAwOAAAADA8AAAAMEAAAAAcFBwUCMAIAAAAFAAAABgIAAAAAAAAAJwEEAAAAdAB5AHAAZQABFwAAAFMAeQBzAHQAZQBtAC4AUwB0AHIAaQBuAGcALAAgAG0AcwBjAG8AcgBsAGkAYgAnAQoAAABTAHkAbQBiAG8AbABOAGEAbQBlAAEOAAAAbABvAGcAUABhAHMAcwBlAGQAVABlAHMAdABzACcBBAAAAHQAeQBwAGUAARgAAABTAHkAcwB0AGUAbQAuAEIAbwBvAGwAZQBhAG4ALAAgAG0AcwBjAG8AcgBsAGkAYgArAQUAAABWAGEAbAB1AGUAAAcFBwUHBQ== + serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABgMAAAAAAAAAAi8CAAAAAUsAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAUwB5AHMAdABlAG0ALgBCAG8AbwBsAGUAYQBuACwAIABtAHMAYwBvAHIAbABpAGIAXQBdACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgACAAAABgIAAAAAAAAAJwEEAAAAdAB5AHAAZQABFwAAAFMAeQBzAHQAZQBtAC4AUwB0AHIAaQBuAGcALAAgAG0AcwBjAG8AcgBsAGkAYgAnAQoAAABTAHkAbQBiAG8AbABOAGEAbQBlAAEOAAAAcgB1AG4AVABlAHMAdABPAG4AUwB0AGEAcgB0ACcBBAAAAHQAeQBwAGUAARgAAABTAHkAcwB0AGUAbQAuAEIAbwBvAGwAZQBhAG4ALAAgAG0AcwBjAG8AcgBsAGkAYgArAQUAAABWAGEAbAB1AGUAAQcFAi8DAAAAAWIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAVQBuAGkAdAB5AEUAbgBnAGkAbgBlAC4AQwBvAG0AcABvAG4AZQBuAHQAWwBdACwAIABVAG4AaQB0AHkARQBuAGcAaQBuAGUALgBDAG8AcgBlAE0AbwBkAHUAbABlAF0AXQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAwAAAAYCAAAAAAAAACcBBAAAAHQAeQBwAGUAARcAAABTAHkAcwB0AGUAbQAuAFMAdAByAGkAbgBnACwAIABtAHMAYwBvAHIAbABpAGIAJwEKAAAAUwB5AG0AYgBvAGwATgBhAG0AZQABEAAAAGkAbgB0AGUAZwByAGEAdABpAG8AbgBUAGUAcwB0AHMAJwEEAAAAdAB5AHAAZQABLwAAAFUAbgBpAHQAeQBFAG4AZwBpAG4AZQAuAEMAbwBtAHAAbwBuAGUAbgB0AFsAXQAsACAAVQBuAGkAdAB5AEUAbgBnAGkAbgBlAC4AQwBvAHIAZQBNAG8AZAB1AGwAZQABAQUAAABWAGEAbAB1AGUALwQAAAABLwAAAFUAbgBpAHQAeQBFAG4AZwBpAG4AZQAuAEMAbwBtAHAAbwBuAGUAbgB0AFsAXQAsACAAVQBuAGkAdAB5AEUAbgBnAGkAbgBlAC4AQwBvAHIAZQBNAG8AZAB1AGwAZQAEAAAABhIAAAAAAAAADAAAAAAMAQAAAAwCAAAADAMAAAAMBAAAAAwFAAAADAYAAAAMBwAAAAwIAAAADAkAAAAMCgAAAAwLAAAADAwAAAAMDQAAAAwOAAAADA8AAAAMEAAAAAwRAAAABwUHBQIwAgAAAAUAAAAGAgAAAAAAAAAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBCgAAAFMAeQBtAGIAbwBsAE4AYQBtAGUAAQ4AAABsAG8AZwBQAGEAcwBzAGUAZABUAGUAcwB0AHMAJwEEAAAAdAB5AHAAZQABGAAAAFMAeQBzAHQAZQBtAC4AQgBvAG8AbABlAGEAbgAsACAAbQBzAGMAbwByAGwAaQBiACsBBQAAAFYAYQBsAHUAZQAABwUHBQcF publicVariablesUnityEngineObjects: - {fileID: 1869341940} - {fileID: 260248065} @@ -168,6 +169,7 @@ MonoBehaviour: - {fileID: 705824622} - {fileID: 908833311} - {fileID: 1161134412} + - {fileID: 1954857071} - {fileID: 759943924} - {fileID: 1756164360} publicVariablesSerializationDataFormat: 0 @@ -241,6 +243,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 55c917076379e6e4eb17e66dc05c7342, type: 2} programSource: {fileID: 11400000, guid: b17200c03afd9054087f3d474b0100c9, type: 2} @@ -266,6 +269,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 0c0a636afadc5bd40a4fecfcc197490d, type: 2} programSource: {fileID: 11400000, guid: 45535888b7aaa5141b1c75c4269f506d, type: 2} @@ -307,6 +311,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: c8b5be5deaaa8e3428349d638514e4c7, type: 2} programSource: {fileID: 11400000, guid: c905299ca66237c469e78bc59fc812e2, type: 2} @@ -435,6 +440,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 55c917076379e6e4eb17e66dc05c7342, type: 2} programSource: {fileID: 11400000, guid: b17200c03afd9054087f3d474b0100c9, type: 2} @@ -460,6 +466,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: a0ca8d646fe3b7c4fb9a5c58bb125606, type: 2} programSource: {fileID: 11400000, guid: bda152340ac68db4d91135be6eb2fa0a, type: 2} @@ -516,6 +523,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: ffffe5b16abd4ed478b42d9c17542e09, type: 2} programSource: {fileID: 11400000, guid: 6fca09774ab0b314cab20be9f2943f22, type: 2} @@ -554,6 +562,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 55c917076379e6e4eb17e66dc05c7342, type: 2} programSource: {fileID: 11400000, guid: b17200c03afd9054087f3d474b0100c9, type: 2} @@ -596,6 +605,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 469d3d7fd908f46418153f4475437e69, type: 2} programSource: {fileID: 11400000, guid: 0e95b13413eb9444c9d95dea3b5c3a90, type: 2} @@ -681,6 +691,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: d8afed069c8e623438ddd6b78f024e9e, type: 2} programSource: {fileID: 11400000, guid: 37304f811bc0b944e9e8d01dfbb491ef, type: 2} @@ -751,10 +762,11 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: ad28350de852e5c44bba8753022aece3, type: 2} programSource: {fileID: 11400000, guid: 5d08af4662fbe5b49b6fcca98c323377, type: 2} - serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABggAAAAAAAAAAi8CAAAAAUwAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwBbAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgBdAF0ALAAgAFYAUgBDAC4AVQBkAG8AbgAuAEMAbwBtAG0AbwBuAAIAAAAGAgAAAAAAAAAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBCgAAAFMAeQBtAGIAbwBsAE4AYQBtAGUAARAAAABkAGUAZgBhAHUAbAB0AFAAdQBiAGwA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 + serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABgkAAAAAAAAAAi8CAAAAAUwAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwBbAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgBdAF0ALAAgAFYAUgBDAC4AVQBkAG8AbgAuAEMAbwBtAG0AbwBuAAIAAAAGAgAAAAAAAAAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBCgAAAFMAeQBtAGIAbwBsAE4AYQBtAGUAARAAAABkAGUAZgBhAHUAbAB0AFAAdQBiAGwA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 publicVariablesUnityEngineObjects: [] publicVariablesSerializationDataFormat: 0 --- !u!114 &402197614 @@ -775,6 +787,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 55c917076379e6e4eb17e66dc05c7342, type: 2} programSource: {fileID: 11400000, guid: b17200c03afd9054087f3d474b0100c9, type: 2} @@ -817,6 +830,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 9707f2b4f3234384a929368dbc59dd23, type: 2} programSource: {fileID: 11400000, guid: e326122c61957684dad8dbf21435b06c, type: 2} @@ -988,6 +1002,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: c7301d985a4fe7649b614fa63743eefb, type: 2} programSource: {fileID: 11400000, guid: c8422e2e7a092464a903d5bb376f7be0, type: 2} @@ -1050,6 +1065,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 55c917076379e6e4eb17e66dc05c7342, type: 2} programSource: {fileID: 11400000, guid: b17200c03afd9054087f3d474b0100c9, type: 2} @@ -1130,6 +1146,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: ebfdc8614a6d4654eaeb876c4198b100, type: 2} programSource: {fileID: 11400000, guid: 60552f7a4b6f0894c9d76cf403e991a4, type: 2} @@ -1190,6 +1207,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 55c917076379e6e4eb17e66dc05c7342, type: 2} programSource: {fileID: 11400000, guid: b17200c03afd9054087f3d474b0100c9, type: 2} @@ -1215,6 +1233,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 7b5f69553acbe304cba2f089b471fa15, type: 2} programSource: {fileID: 11400000, guid: 35ce2f2631f86e7468e3d772bb41fddc, type: 2} @@ -1329,6 +1348,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 1a9cee3f56be9fb42ace8cf22ac79973, type: 2} programSource: {fileID: 11400000, guid: 0010ad2d1f2443341a5679bc22848d1b, type: 2} @@ -1371,6 +1391,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 55c917076379e6e4eb17e66dc05c7342, type: 2} programSource: {fileID: 11400000, guid: b17200c03afd9054087f3d474b0100c9, type: 2} @@ -1396,6 +1417,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: d9650afd0fb6cfc41ab5ec604782360f, type: 2} programSource: {fileID: 11400000, guid: ab385d61a0570f8438717eb9343b19c6, type: 2} @@ -1451,6 +1473,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 93dc257ab96c2d84483bbe8bf5afd5d4, type: 2} programSource: {fileID: 11400000, guid: 518bc3c50e6d8db4e944181651e673dc, type: 2} @@ -1521,6 +1544,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 0e69235b3f40ede4fbfc565009807ca0, type: 2} programSource: {fileID: 11400000, guid: a814dd095e217094783161f851d22677, type: 2} @@ -1562,6 +1586,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 55c917076379e6e4eb17e66dc05c7342, type: 2} programSource: {fileID: 11400000, guid: b17200c03afd9054087f3d474b0100c9, type: 2} @@ -1650,6 +1675,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 55c917076379e6e4eb17e66dc05c7342, type: 2} programSource: {fileID: 11400000, guid: b17200c03afd9054087f3d474b0100c9, type: 2} @@ -1675,6 +1701,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 989e6fff91f0e554687b35b4ab4ad384, type: 2} programSource: {fileID: 11400000, guid: 48df62f63db4c32438044816f153d3f3, type: 2} @@ -1795,6 +1822,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 55c917076379e6e4eb17e66dc05c7342, type: 2} programSource: {fileID: 11400000, guid: b17200c03afd9054087f3d474b0100c9, type: 2} @@ -1820,6 +1848,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 2b3f8e0d3b9b0584f889d3c9bdb3d2bd, type: 2} programSource: {fileID: 11400000, guid: 0e614de88eb7daa42b083bbd7d9a20bf, type: 2} @@ -6500,6 +6529,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 1 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: f69908bf5ff5adf4283333fc8951b57d, type: 2} programSource: {fileID: 11400000, guid: fa52d8b703fd906459112715b1ef1f3a, type: 2} @@ -6524,6 +6554,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 1 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: aef439f478fb967489167a6438f2fe23, type: 2} programSource: {fileID: 11400000, guid: 667c46fd2864a124ea921d98d4914fe5, type: 2} @@ -6661,6 +6692,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 55c917076379e6e4eb17e66dc05c7342, type: 2} programSource: {fileID: 11400000, guid: b17200c03afd9054087f3d474b0100c9, type: 2} @@ -6731,6 +6763,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 55c917076379e6e4eb17e66dc05c7342, type: 2} programSource: {fileID: 11400000, guid: b17200c03afd9054087f3d474b0100c9, type: 2} @@ -6756,6 +6789,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 5fc02c181e528ec4aabef8105972799c, type: 2} programSource: {fileID: 11400000, guid: d9aabdb4764d92841be1ee388f8dcd07, type: 2} @@ -6953,6 +6987,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 356f79752c2396743bcd291d4284e4d2, type: 2} programSource: {fileID: 11400000, guid: 213b9ec3701d93841b1e93d201119846, type: 2} @@ -7147,6 +7182,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 32bde2c50ec16224bbfbcbb884ac28f6, type: 2} programSource: {fileID: 11400000, guid: 39642a2265551724384ce81ded1cf524, type: 2} @@ -7203,6 +7239,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 55c917076379e6e4eb17e66dc05c7342, type: 2} programSource: {fileID: 11400000, guid: b17200c03afd9054087f3d474b0100c9, type: 2} @@ -7228,6 +7265,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: beec172624f6e114c9ef6779bb133c11, type: 2} programSource: {fileID: 11400000, guid: 99af9416f9a67ad4094b1e9bf8c896bd, type: 2} @@ -7300,6 +7338,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 7060a6d09cccff94b95a49802952bb8b, type: 2} programSource: {fileID: 11400000, guid: 27816269bae97da4f8dec8c5959e4677, type: 2} @@ -7324,6 +7363,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 2d7c644cd0b725c4991f4b4b26d428e4, type: 2} programSource: {fileID: 11400000, guid: 75f3b7bb830f4324a8b2f49814f3493a, type: 2} @@ -7348,6 +7388,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 7060a6d09cccff94b95a49802952bb8b, type: 2} programSource: {fileID: 11400000, guid: 27816269bae97da4f8dec8c5959e4677, type: 2} @@ -7372,6 +7413,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 7060a6d09cccff94b95a49802952bb8b, type: 2} programSource: {fileID: 11400000, guid: 27816269bae97da4f8dec8c5959e4677, type: 2} @@ -7427,6 +7469,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 657f05d4fbd8528478c389ee0f73e345, type: 2} programSource: {fileID: 11400000, guid: 11da5e3fbabd9684c8357d050833f2d0, type: 2} @@ -7562,6 +7605,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 68d8eee2becedbc43b62ce8457edf59c, type: 2} programSource: {fileID: 11400000, guid: 399f041c3cb27e246ab4aab3fc18dbc9, type: 2} @@ -7648,6 +7692,7 @@ Transform: - {fileID: 705824624} - {fileID: 908833313} - {fileID: 534102781} + - {fileID: 1954857073} m_Father: {fileID: 41814632} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -7686,6 +7731,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 55c917076379e6e4eb17e66dc05c7342, type: 2} programSource: {fileID: 11400000, guid: b17200c03afd9054087f3d474b0100c9, type: 2} @@ -7809,6 +7855,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 55c917076379e6e4eb17e66dc05c7342, type: 2} programSource: {fileID: 11400000, guid: b17200c03afd9054087f3d474b0100c9, type: 2} @@ -7834,6 +7881,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 8fafc841cc61d6c43b62f098d3040bc9, type: 2} programSource: {fileID: 11400000, guid: c0340001493d5144dacae6e7f2009eea, type: 2} @@ -7941,6 +7989,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 55c917076379e6e4eb17e66dc05c7342, type: 2} programSource: {fileID: 11400000, guid: b17200c03afd9054087f3d474b0100c9, type: 2} @@ -7983,6 +8032,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 7060a6d09cccff94b95a49802952bb8b, type: 2} programSource: {fileID: 11400000, guid: 27816269bae97da4f8dec8c5959e4677, type: 2} @@ -8160,6 +8210,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 55c917076379e6e4eb17e66dc05c7342, type: 2} programSource: {fileID: 11400000, guid: b17200c03afd9054087f3d474b0100c9, type: 2} @@ -8185,6 +8236,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: deb18d90b25ab144686be16c78c1933e, type: 2} programSource: {fileID: 11400000, guid: db172992aa06e97408acfca51fce41ce, type: 2} @@ -8238,6 +8290,89 @@ Transform: m_Father: {fileID: 1949751808} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1954857070 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1954857073} + - component: {fileID: 1954857071} + - component: {fileID: 1954857072} + m_Layer: 0 + m_Name: PropertyTest + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1954857071 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1954857070} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 45115577ef41a5b4ca741ed302693907, type: 3} + m_Name: + m_EditorClassIdentifier: + interactTextPlacement: {fileID: 0} + interactText: Use + interactTextGO: {fileID: 0} + proximity: 2 + SynchronizePosition: 0 + AllowCollisionOwnershipTransfer: 0 + Reliable: 0 + serializedProgramAsset: {fileID: 11400000, guid: 55c917076379e6e4eb17e66dc05c7342, + type: 2} + programSource: {fileID: 11400000, guid: b17200c03afd9054087f3d474b0100c9, type: 2} + serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABgQAAAAAAAAAAi8CAAAAAUsAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAUwB5AHMAdABlAG0ALgBCAG8AbwBsAGUAYQBuACwAIABtAHMAYwBvAHIAbABpAGIAXQBdACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgACAAAABgIAAAAAAAAAJwEEAAAAdAB5AHAAZQABFwAAAFMAeQBzAHQAZQBtAC4AUwB0AHIAaQBuAGcALAAgAG0AcwBjAG8AcgBsAGkAYgAnAQoAAABTAHkAbQBiAG8AbABOAGEAbQBlAAENAAAAcgB1AG4AUwB1AGkAdABlAFQAZQBzAHQAcwAnAQQAAAB0AHkAcABlAAEYAAAAUwB5AHMAdABlAG0ALgBCAG8AbwBsAGUAYQBuACwAIABtAHMAYwBvAHIAbABpAGIAKwEFAAAAVgBhAGwAdQBlAAEHBQIvAwAAAAFKAAAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQBgADEAWwBbAFMAeQBzAHQAZQBtAC4AUwB0AHIAaQBuAGcALAAgAG0AcwBjAG8AcgBsAGkAYgBdAF0ALAAgAFYAUgBDAC4AVQBkAG8AbgAuAEMAbwBtAG0AbwBuAAMAAAAGAgAAAAAAAAAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBCgAAAFMAeQBtAGIAbwBsAE4AYQBtAGUAAQ0AAAB0AGUAcwB0AFMAdQBpAHQAZQBOAGEAbQBlACcBBAAAAHQAeQBwAGUAARcAAABTAHkAcwB0AGUAbQAuAFMAdAByAGkAbgBnACwAIABtAHMAYwBvAHIAbABpAGIAJwEFAAAAVgBhAGwAdQBlAAEOAAAAUAByAG8AcABlAHIAdAB5ACAAVABlAHMAdABzAAcFAjACAAAABAAAAAYCAAAAAAAAACcBBAAAAHQAeQBwAGUAARcAAABTAHkAcwB0AGUAbQAuAFMAdAByAGkAbgBnACwAIABtAHMAYwBvAHIAbABpAGIAJwEKAAAAUwB5AG0AYgBvAGwATgBhAG0AZQABFQAAAGYAbwByAGMAZQBQAHIAaQBuAHQAUABhAHMAcwBlAGQAVABlAHMAdABzACcBBAAAAHQAeQBwAGUAARgAAABTAHkAcwB0AGUAbQAuAEIAbwBvAGwAZQBhAG4ALAAgAG0AcwBjAG8AcgBsAGkAYgArAQUAAABWAGEAbAB1AGUAAAcFAi8EAAAAAWIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAVQBuAGkAdAB5AEUAbgBnAGkAbgBlAC4AQwBvAG0AcABvAG4AZQBuAHQAWwBdACwAIABVAG4AaQB0AHkARQBuAGcAaQBuAGUALgBDAG8AcgBlAE0AbwBkAHUAbABlAF0AXQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ABQAAAAYCAAAAAAAAACcBBAAAAHQAeQBwAGUAARcAAABTAHkAcwB0AGUAbQAuAFMAdAByAGkAbgBnACwAIABtAHMAYwBvAHIAbABpAGIAJwEKAAAAUwB5AG0AYgBvAGwATgBhAG0AZQABBQAAAHQAZQBzAHQAcwAnAQQAAAB0AHkAcABlAAEvAAAAVQBuAGkAdAB5AEUAbgBnAGkAbgBlAC4AQwBvAG0AcABvAG4AZQBuAHQAWwBdACwAIABVAG4AaQB0AHkARQBuAGcAaQBuAGUALgBDAG8AcgBlAE0AbwBkAHUAbABlAAEBBQAAAFYAYQBsAHUAZQAvBQAAAAEvAAAAVQBuAGkAdAB5AEUAbgBnAGkAbgBlAC4AQwBvAG0AcABvAG4AZQBuAHQAWwBdACwAIABVAG4AaQB0AHkARQBuAGcAaQBuAGUALgBDAG8AcgBlAE0AbwBkAHUAbABlAAYAAAAGAQAAAAAAAAAMAAAAAAcFBwUHBQcF + publicVariablesUnityEngineObjects: + - {fileID: 1954857072} + publicVariablesSerializationDataFormat: 0 +--- !u!114 &1954857072 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1954857070} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 45115577ef41a5b4ca741ed302693907, type: 3} + m_Name: + m_EditorClassIdentifier: + interactTextPlacement: {fileID: 0} + interactText: Use + interactTextGO: {fileID: 0} + proximity: 2 + SynchronizePosition: 0 + AllowCollisionOwnershipTransfer: 0 + Reliable: 0 + serializedProgramAsset: {fileID: 11400000, guid: c341eeb82008276418f85fd69d4dd8b3, + type: 2} + programSource: {fileID: 11400000, guid: e6b13e0cbf910824dbf27af03fe07b7f, type: 2} + serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABgAAAAAAAAAABwUHBQ== + publicVariablesUnityEngineObjects: [] + publicVariablesSerializationDataFormat: 0 +--- !u!4 &1954857073 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1954857070} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1722523552} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1965936090 GameObject: m_ObjectHideFlags: 0 @@ -8394,6 +8529,7 @@ MonoBehaviour: proximity: 2 SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 + Reliable: 0 serializedProgramAsset: {fileID: 11400000, guid: 743bb2e798bf8ae4f930181a5bcc80a6, type: 2} programSource: {fileID: 11400000, guid: b834b77fec1f59c46b62d929e72fa793, type: 2} diff --git a/Assets/UdonSharp/Tests/TestScripts/Core/PropertyTest.asset b/Assets/UdonSharp/Tests/TestScripts/Core/PropertyTest.asset new file mode 100644 index 00000000..f828436e --- /dev/null +++ b/Assets/UdonSharp/Tests/TestScripts/Core/PropertyTest.asset @@ -0,0 +1,305 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c333ccfdd0cbdbc4ca30cef2dd6e6b9b, type: 3} + m_Name: PropertyTest + m_EditorClassIdentifier: + serializedUdonProgramAsset: {fileID: 11400000, guid: c341eeb82008276418f85fd69d4dd8b3, + type: 2} + udonAssembly: + assemblyError: + sourceCsScript: {fileID: 11500000, guid: b9f434e3a13693641bda7faffefce9fb, type: 3} + behaviourSyncMode: 0 + behaviourIDHeapVarName: __refl_const_intnl_udonTypeID + compileErrors: [] + hasInteractEvent: 0 + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: + - {fileID: 11500000, guid: 11d8d463c5030e74bbaa9da5236e94e9, type: 3} + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: + - Name: fieldDefinitions + Entry: 7 + Data: 0|System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[UdonSharp.Compiler.FieldDefinition, + UdonSharp.Editor]], mscorlib + - Name: comparer + Entry: 7 + Data: 1|System.Collections.Generic.GenericEqualityComparer`1[[System.String, + mscorlib]], mscorlib + - Name: + Entry: 8 + Data: + - Name: + Entry: 12 + Data: 4 + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: tester + - Name: $v + Entry: 7 + Data: 2|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: fieldSymbol + Entry: 7 + Data: 3|UdonSharp.Compiler.SymbolDefinition, UdonSharp.Editor + - Name: internalType + Entry: 7 + Data: 4|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: UdonSharp.Tests.IntegrationTestSuite, Assembly-CSharp + - Name: + Entry: 8 + Data: + - Name: declarationType + Entry: 3 + Data: 1 + - Name: syncMode + Entry: 3 + Data: 0 + - Name: symbolResolvedTypeName + Entry: 1 + Data: VRCUdonUdonBehaviour + - Name: symbolOriginalName + Entry: 1 + Data: tester + - Name: symbolUniqueName + Entry: 1 + Data: tester + - Name: symbolDefaultValue + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: fieldAttributes + Entry: 7 + Data: 5|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 1 + - Name: + Entry: 7 + Data: 6|UnityEngine.HideInInspector, UnityEngine.CoreModule + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: userBehaviourSource + Entry: 10 + Data: 0 + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: backingFloat + - Name: $v + Entry: 7 + Data: 7|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: fieldSymbol + Entry: 7 + Data: 8|UdonSharp.Compiler.SymbolDefinition, UdonSharp.Editor + - Name: internalType + Entry: 7 + Data: 9|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: System.Single, mscorlib + - Name: + Entry: 8 + Data: + - Name: declarationType + Entry: 3 + Data: 2 + - Name: syncMode + Entry: 3 + Data: 0 + - Name: symbolResolvedTypeName + Entry: 1 + Data: SystemSingle + - Name: symbolOriginalName + Entry: 1 + Data: backingFloat + - Name: symbolUniqueName + Entry: 1 + Data: backingFloat + - Name: symbolDefaultValue + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: fieldAttributes + Entry: 7 + Data: 10|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: userBehaviourSource + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: backingField + - Name: $v + Entry: 7 + Data: 11|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: fieldSymbol + Entry: 7 + Data: 12|UdonSharp.Compiler.SymbolDefinition, UdonSharp.Editor + - Name: internalType + Entry: 7 + Data: 13|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: System.Int32, mscorlib + - Name: + Entry: 8 + Data: + - Name: declarationType + Entry: 3 + Data: 2 + - Name: syncMode + Entry: 3 + Data: 0 + - Name: symbolResolvedTypeName + Entry: 1 + Data: SystemInt32 + - Name: symbolOriginalName + Entry: 1 + Data: backingField + - Name: symbolUniqueName + Entry: 1 + Data: backingField + - Name: symbolDefaultValue + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: fieldAttributes + Entry: 7 + Data: 14|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: userBehaviourSource + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: accessCounter + - Name: $v + Entry: 7 + Data: 15|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: fieldSymbol + Entry: 7 + Data: 16|UdonSharp.Compiler.SymbolDefinition, UdonSharp.Editor + - Name: internalType + Entry: 9 + Data: 13 + - Name: declarationType + Entry: 3 + Data: 2 + - Name: syncMode + Entry: 3 + Data: 0 + - Name: symbolResolvedTypeName + Entry: 1 + Data: SystemInt32 + - Name: symbolOriginalName + Entry: 1 + Data: accessCounter + - Name: symbolUniqueName + Entry: 1 + Data: accessCounter + - Name: symbolDefaultValue + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: fieldAttributes + Entry: 7 + Data: 17|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: userBehaviourSource + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: diff --git a/Assets/UdonSharp/Tests/TestScripts/Core/PropertyTest.asset.meta b/Assets/UdonSharp/Tests/TestScripts/Core/PropertyTest.asset.meta new file mode 100644 index 00000000..f2513c76 --- /dev/null +++ b/Assets/UdonSharp/Tests/TestScripts/Core/PropertyTest.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e6b13e0cbf910824dbf27af03fe07b7f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UdonSharp/Tests/TestScripts/Core/PropertyTest.cs b/Assets/UdonSharp/Tests/TestScripts/Core/PropertyTest.cs new file mode 100644 index 00000000..2db56162 --- /dev/null +++ b/Assets/UdonSharp/Tests/TestScripts/Core/PropertyTest.cs @@ -0,0 +1,109 @@ + +using UdonSharp; +using UnityEngine; +using VRC.SDKBase; +using VRC.Udon; + +namespace UdonSharp.Tests +{ + [AddComponentMenu("Udon Sharp/Tests/PropertyTest")] + public class PropertyTest : UdonSharpBehaviour + { + [HideInInspector] + public IntegrationTestSuite tester; + + public string MyStrProperty => "Test " + 1; + + public int MyIntProperty { get; set; } + + float backingFloat; + public float MyFloatProperty { get => backingFloat; set => backingFloat = value; } + + int backingField; + public int MyIntBackedProperty + { + get { return backingField; } + set + { + MyIntProperty = value; + backingField = value; + } + } + + public PropertyTest MyUserTypeProperty { get { return this; } } + + int accessCounter = 0; + public int MyAccessCounter { set { /*Debug.Log("Setting access counter to " + value); */accessCounter = value; } get { /*Debug.Log("Access counter: " + accessCounter);*/ return accessCounter++; } } + + public void ExecuteTests() + { + PropertyTest self = this; + + tester.TestAssertion("Local property getter 1", MyStrProperty == "Test 1"); + tester.TestAssertion("External property getter 1", self.MyStrProperty == "Test 1"); + + tester.TestAssertion("Property initialized", MyIntProperty == 0); + MyIntProperty = 1; + tester.TestAssertion("Property set", MyIntProperty == 1); + tester.TestAssertion("Property pre-increment", MyIntProperty++ == 1); + tester.TestAssertion("Property post-increment", MyIntProperty == 2); + + self.MyIntProperty = 5; + tester.TestAssertion("Property external set", MyIntProperty == 5); + tester.TestAssertion("Property external get", self.MyIntProperty == 5); + + MyIntBackedProperty = 8; + tester.TestAssertion("Property manual setter", MyIntProperty == 8 && MyIntBackedProperty == 8); + + PropertyTest[] selfArr = new PropertyTest[] { this }; + + selfArr[0].MyIntProperty = 10; + + tester.TestAssertion("Array property access 1", selfArr[0].MyIntProperty == 10); + tester.TestAssertion("Array property access 2", ++selfArr[0].MyIntProperty == 11); + tester.TestAssertion("Array property access 3", selfArr[0].MyIntProperty++ == 11); + tester.TestAssertion("Array property access 4", selfArr[0].MyIntProperty == 12); + + MyUserTypeProperty.MyIntBackedProperty = 2; + tester.TestAssertion("User type maintained", MyIntProperty == 2); + + self = MyUserTypeProperty; + MyUserTypeProperty.MyIntProperty = 4; + + tester.TestAssertion("User type maintained 2", MyIntProperty == 4); + + backingFloat = 5f; + MyFloatProperty = (int)4; + + tester.TestAssertion("Implicit conversion type maintained", backingFloat.GetType() == typeof(float)); + + tester.TestAssertion("Access counter 1", MyAccessCounter == 0); + tester.TestAssertion("Access counter 2", MyAccessCounter == 1); + + tester.TestAssertion("Access counter intermediates", MyAccessCounter + MyAccessCounter == 5); + tester.TestAssertion("Access counter external intermediates", self.MyAccessCounter + self.MyAccessCounter == 9); + + tester.TestAssertion("Access counter increment", ++MyAccessCounter == 7); + tester.TestAssertion("Access counter increment 2", MyAccessCounter == 7); + tester.TestAssertion("Access counter increment 3", MyAccessCounter++ == 8); + tester.TestAssertion("Access counter increment 4", MyAccessCounter == 9); + tester.TestAssertion("Access counter increment 5", MyAccessCounter == 10); + + //Debug.Log("Start tests"); + + //int preIncrementResult = ++MyAccessCounter; + //Debug.Log("Pre inc " + preIncrementResult); + //Debug.Log("Pre inc access counter " + accessCounter); + + //int postIncrementResult = MyAccessCounter++; + //Debug.Log("Post inc " + postIncrementResult); + //Debug.Log("Post inc access counter " + accessCounter); + + //Debug.Log("In place addition"); + + int additionResult = MyAccessCounter += 6; + + tester.TestAssertion("In place addition", accessCounter == 17 && additionResult == 17); + } + } +} diff --git a/Assets/UdonSharp/Tests/TestScripts/Core/PropertyTest.cs.meta b/Assets/UdonSharp/Tests/TestScripts/Core/PropertyTest.cs.meta new file mode 100644 index 00000000..ec23f996 --- /dev/null +++ b/Assets/UdonSharp/Tests/TestScripts/Core/PropertyTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b9f434e3a13693641bda7faffefce9fb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 5abb1dc3c23c570408d68d455e93ea9ca40cdcdf Mon Sep 17 00:00:00 2001 From: Merlin <36685500+MerlinVR@users.noreply.github.com> Date: Mon, 14 Jun 2021 15:31:45 -0700 Subject: [PATCH 11/14] Fix case where property return values are shared - Fix case where property return values are shared which can cause issues with stuff like `MyValue + MyValue` where the getter for `MyValue` modifies the return --- Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs b/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs index 538151c8..119c8f46 100644 --- a/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs +++ b/Assets/UdonSharp/Editor/UdonSharpExpressionCapture.cs @@ -479,7 +479,8 @@ public SymbolDefinition ExecuteGet() visitorContext.uasmBuilder.AddJumpLabel(exitLabel); exitJumpLocation.symbolDefaultValue = exitLabel.resolvedAddress; - outSymbol = getter.returnSymbol; + outSymbol = AllocateOutputSymbol(getter.returnSymbol.userCsType); + visitorContext.uasmBuilder.AddCopy(outSymbol, getter.returnSymbol); } else if (captureArchetype == ExpressionCaptureArchetype.ExternUserProperty) { From 149c60cd217009713cb17071f9e192ff32ed6cf0 Mon Sep 17 00:00:00 2001 From: Merlin <36685500+MerlinVR@users.noreply.github.com> Date: Mon, 14 Jun 2021 15:33:17 -0700 Subject: [PATCH 12/14] Fix redundant gets on pre and postfix increment/decrement - Fix redundant gets on prefix/postfix decrement and increment causing them to misbehave on properties --- Assets/UdonSharp/Editor/UdonSharpASTVisitor.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Assets/UdonSharp/Editor/UdonSharpASTVisitor.cs b/Assets/UdonSharp/Editor/UdonSharpASTVisitor.cs index 385631be..554fc98f 100644 --- a/Assets/UdonSharp/Editor/UdonSharpASTVisitor.cs +++ b/Assets/UdonSharp/Editor/UdonSharpASTVisitor.cs @@ -1208,7 +1208,7 @@ public override void VisitPrefixUnaryExpression(PrefixUnaryExpressionSyntax node operatorMethodCapture.SetToMethods(operatorMethods.ToArray()); SymbolDefinition valueConstant = visitorContext.topTable.CreateConstSymbol(operandCapture.GetReturnType(), System.Convert.ChangeType(1, operandCapture.GetReturnType())); - + try { resultSymbol = operatorMethodCapture.Invoke(new SymbolDefinition[] { operandCapture.ExecuteGet(), valueConstant }); @@ -1221,7 +1221,7 @@ public override void VisitPrefixUnaryExpression(PrefixUnaryExpressionSyntax node } if (topScope != null) - topScope.SetToLocalSymbol(operandCapture.ExecuteGet()); + topScope.SetToLocalSymbol(resultSymbol); } } } @@ -1272,7 +1272,7 @@ public override void VisitPostfixUnaryExpression(PostfixUnaryExpressionSyntax no SymbolDefinition valueConstant = visitorContext.topTable.CreateConstSymbol(operandCapture.GetReturnType(), System.Convert.ChangeType(1, operandCapture.GetReturnType())); - SymbolDefinition resultSymbol = operatorMethodCapture.Invoke(new SymbolDefinition[] { operandCapture.ExecuteGet(), valueConstant }); + SymbolDefinition resultSymbol = operatorMethodCapture.Invoke(new SymbolDefinition[] { preIncrementStore, valueConstant }); operandCapture.ExecuteSet(resultSymbol, true); } From 37c002706aad7b1ab9157732ac27264caeb02eba Mon Sep 17 00:00:00 2001 From: Merlin <36685500+MerlinVR@users.noreply.github.com> Date: Mon, 14 Jun 2021 15:39:51 -0700 Subject: [PATCH 13/14] Exclude generated backing fields for properties from behaviour serializer - Attempting to serialize anonymous backing fields breaks the serializer, so don't. --- .../Formatters/UdonSharpBehaviourFormatterEmitter.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Assets/UdonSharp/Editor/Serialization/Formatters/UdonSharpBehaviourFormatterEmitter.cs b/Assets/UdonSharp/Editor/Serialization/Formatters/UdonSharpBehaviourFormatterEmitter.cs index 57e006ce..33dae587 100644 --- a/Assets/UdonSharp/Editor/Serialization/Formatters/UdonSharpBehaviourFormatterEmitter.cs +++ b/Assets/UdonSharp/Editor/Serialization/Formatters/UdonSharpBehaviourFormatterEmitter.cs @@ -154,6 +154,9 @@ public static Formatter GetFormatter() where T : UdonSharpBehaviour foreach (FieldInfo field in allFields) { + if (field.IsDefined(typeof(CompilerGeneratedAttribute), false)) + continue; + if ((field.IsPublic && field.GetAttribute() == null) || (!field.IsPublic && field.GetAttribute() != null)) { From 0790f21f86df1e2b670577489e0f5de5262e3300 Mon Sep 17 00:00:00 2001 From: Merlin <36685500+MerlinVR@users.noreply.github.com> Date: Mon, 14 Jun 2021 15:50:11 -0700 Subject: [PATCH 14/14] Make setter and getter methods start with an underscore - Make setter and getter methods start with an underscore since they cannot be called via the network. --- Assets/UdonSharp/Editor/UdonSharpPropertyVisitor.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Assets/UdonSharp/Editor/UdonSharpPropertyVisitor.cs b/Assets/UdonSharp/Editor/UdonSharpPropertyVisitor.cs index a1dc73e0..cd672cdd 100644 --- a/Assets/UdonSharp/Editor/UdonSharpPropertyVisitor.cs +++ b/Assets/UdonSharp/Editor/UdonSharpPropertyVisitor.cs @@ -94,7 +94,7 @@ public override void VisitPropertyDeclaration(PropertyDeclarationSyntax node) if (isSetter) { SetterDefinition setter = new SetterDefinition(); - setter.accessorName = $"set_{node.Identifier.Text}"; + setter.accessorName = $"_set_{node.Identifier.Text}"; setter.entryPoint = visitorContext.labelTable.GetNewJumpLabel("udonMethodEntryPoint"); setter.userCallStart = visitorContext.labelTable.GetNewJumpLabel("userMethodCallEntry"); setter.returnPoint = visitorContext.labelTable.GetNewJumpLabel("methodReturnPoint"); @@ -108,7 +108,7 @@ public override void VisitPropertyDeclaration(PropertyDeclarationSyntax node) else { GetterDefinition getter = new GetterDefinition(); - getter.accessorName = $"get_{node.Identifier.Text}"; + getter.accessorName = $"_get_{node.Identifier.Text}"; getter.entryPoint = visitorContext.labelTable.GetNewJumpLabel("udonMethodEntryPoint"); getter.userCallStart = visitorContext.labelTable.GetNewJumpLabel("userMethodCallEntry"); getter.returnPoint = visitorContext.labelTable.GetNewJumpLabel("methodReturnPoint"); @@ -130,7 +130,7 @@ public override void VisitPropertyDeclaration(PropertyDeclarationSyntax node) else { GetterDefinition getter = new GetterDefinition(); - getter.accessorName = $"get_{node.Identifier.Text}"; + getter.accessorName = $"_get_{node.Identifier.Text}"; getter.entryPoint = visitorContext.labelTable.GetNewJumpLabel("udonMethodEntryPoint"); getter.userCallStart = visitorContext.labelTable.GetNewJumpLabel("userMethodCallEntry"); getter.returnPoint = visitorContext.labelTable.GetNewJumpLabel("methodReturnPoint");