示例#1
0
        protected override void GenerateCodePropertyField(MemberFieldDefinition field)
        {
            string ptype = GetCLRTypeName(field);
            string pname = GetClassName() + "::" + (field.HasAttribute <RenameAttribute>() ? field.GetAttribute <RenameAttribute> ().Name : field.NativeName);

            if (field.IsNativeArray)
            {
                if (field.MemberType.HasAttribute <NativeValueContainerAttribute>() ||
                    (field.MemberType.IsValueType && !field.MemberType.HasWrapType(WrapTypes.NativePtrValueType)))
                {
                    ParamDefinition tmpParam = new ParamDefinition(this.MetaDef, field, field.NativeName + "_array");
                    switch (field.PassedByType)
                    {
                    case PassedByType.Value:
                        tmpParam.PassedByType = PassedByType.Pointer;
                        break;

                    case PassedByType.Pointer:
                        tmpParam.PassedByType = PassedByType.PointerPointer;
                        break;

                    default:
                        throw new Exception("Unexpected");
                    }

                    ptype = GetCLRTypeName(tmpParam);
                    string managedType = field.MemberType.ProduceNativeCallConversionCode(GetNativeInvokationTarget(field), tmpParam);

                    _codeBuilder.AppendLine(ptype + " " + pname + "::get()");
                    _codeBuilder.AppendLine("{");
                    _codeBuilder.AppendLine("\treturn " + managedType + ";");
                    _codeBuilder.AppendLine("}");
                }
                else
                {
                    string managedType = field.MemberType.ProduceNativeCallConversionCode(GetNativeInvokationTarget(field) + "[index]", field);

                    _codeBuilder.AppendLine(ptype + " " + pname + "::get(int index)");
                    _codeBuilder.AppendLine("{");
                    _codeBuilder.AppendLine("\tif (index < 0 || index >= " + field.ArraySize + ") throw gcnew IndexOutOfRangeException();");
                    _codeBuilder.AppendLine("\treturn " + managedType + ";");
                    _codeBuilder.AppendLine("}");
                    _codeBuilder.AppendLine("void " + pname + "::set(int index, " + ptype + " value )");
                    _codeBuilder.AppendLine("{");
                    _codeBuilder.IncreaseIndent();
                    _codeBuilder.AppendLine("if (index < 0 || index >= " + field.ArraySize + ") throw gcnew IndexOutOfRangeException();");
                    string param = AddParameterConversion(new ParamDefinition(this.MetaDef, field, "value"));
                    _codeBuilder.AppendLine(GetNativeInvokationTarget(field) + "[index] = " + param + ";");
                    _codeBuilder.DecreaseIndent();
                    _codeBuilder.AppendLine("}");
                }
            }
            else if (_cachedMembers.Contains(field))
            {
                string managedType;
                if (field.MemberType.IsSTLContainer)
                {
                    managedType = GetNativeInvokationTarget(field);
                }
                else
                {
                    managedType = field.MemberType.ProduceNativeCallConversionCode(GetNativeInvokationTarget(field), field);
                }
                string priv = NameToPrivate(field);

                _codeBuilder.AppendLine(ptype + " " + pname + "::get()");
                _codeBuilder.AppendLine("{");
                if (!field.IsStatic)
                {
                    _codeBuilder.AppendLine("\treturn ( CLR_NULL == " + priv + " ) ? (" + priv + " = " + managedType + ") : " + priv + ";");
                }
                else
                {
                    _codeBuilder.AppendLine("\treturn " + priv + ";");
                }
                _codeBuilder.AppendLine("}");
            }
            else
            {
                string managedType = field.MemberType.ProduceNativeCallConversionCode(GetNativeInvokationTarget(field), field);

                _codeBuilder.AppendLine(ptype + " " + pname + "::get()");
                _codeBuilder.AppendLine("{");
                _codeBuilder.AppendLine("\treturn " + managedType + ";");
                _codeBuilder.AppendLine("}");

                if ( // SharedPtrs can be copied by value. Let all be copied by value just to be sure (field.PassedByType == PassedByType.Pointer || field.Type.IsValueType)
                    !IsReadOnly && !field.MemberType.HasAttribute <ReadOnlyForFieldsAttribute>() &&
                    !field.IsConst)
                {
                    _codeBuilder.AppendLine("void " + pname + "::set( " + ptype + " value )");
                    _codeBuilder.AppendLine("{");
                    _codeBuilder.IncreaseIndent();
                    string param = AddParameterConversion(new ParamDefinition(this.MetaDef, field, "value"));
                    _codeBuilder.AppendLine(GetNativeInvokationTarget(field) + " = " + param + ";");
                    _codeBuilder.DecreaseIndent();
                    _codeBuilder.AppendLine("}");
                }
            }
        }
示例#2
0
        protected override void GenerateCodePropertyField(MemberFieldDefinition field)
        {
            //TODO comments for fields
            //AddComments(field);

            string ptype;

            if (field.IsNativeArray)
            {
                if (field.MemberType.HasAttribute <NativeValueContainerAttribute>() ||
                    (field.MemberType.IsValueType && !field.MemberType.HasWrapType(WrapTypes.NativePtrValueType)))
                {
                    ParamDefinition tmpParam = new ParamDefinition(this.MetaDef, field, field.NativeName);
                    switch (field.PassedByType)
                    {
                    case PassedByType.Value:
                        tmpParam.PassedByType = PassedByType.Pointer;
                        break;

                    case PassedByType.Pointer:
                        tmpParam.PassedByType = PassedByType.PointerPointer;
                        break;

                    default:
                        throw new Exception("Unexpected");
                    }

                    ptype = tmpParam.MemberTypeCLRName;
                    _codeBuilder.AppendIndent("");
                    if (field.IsStatic)
                    {
                        _codeBuilder.Append("static ");
                    }
                    _codeBuilder.AppendFormat("property {0} {1}\n", ptype, field.NativeName);
                    _codeBuilder.AppendLine("{");

                    _codeBuilder.AppendLine(field.ProtectionLevel.GetCLRProtectionName() + ":");
                    _codeBuilder.AppendLine("\t" + ptype + " get();");

                    _codeBuilder.AppendLine("}");
                }
                else
                {
                    ptype = field.MemberTypeCLRName;
                    _codeBuilder.AppendIndent("");
                    if (field.IsStatic)
                    {
                        _codeBuilder.Append("static ");
                    }
                    _codeBuilder.AppendFormat("property {0} {1}[int]\n", ptype, field.NativeName);
                    _codeBuilder.AppendLine("{");

                    _codeBuilder.AppendLine(field.ProtectionLevel.GetCLRProtectionName() + ":");
                    _codeBuilder.AppendLine("\t" + ptype + " get(int index);");
                    _codeBuilder.AppendLine("\tvoid set(int index, " + ptype + " value);");

                    _codeBuilder.AppendLine("}");
                }
            }
            else if (_cachedMembers.Contains(field))
            {
                ptype = field.MemberTypeCLRName;
                _codeBuilder.AppendIndent("");
                if (field.IsStatic)
                {
                    _codeBuilder.Append("static ");
                }
                _codeBuilder.AppendFormat("property {0} {1}\n", ptype, field.NativeName);
                _codeBuilder.AppendLine("{");

                _codeBuilder.AppendLine(field.ProtectionLevel.GetCLRProtectionName() + ":");
                _codeBuilder.AppendLine("\t" + ptype + " get();");

                _codeBuilder.AppendLine("}");
            }
            else
            {
                ptype = GetCLRTypeName(field);
                _codeBuilder.AppendIndent("");
                if (field.IsStatic)
                {
                    _codeBuilder.Append("static ");
                }
                if (field.HasAttribute <RenameAttribute>())
                {
                    _codeBuilder.AppendFormat("property {0} {1}\n", ptype, field.GetAttribute <RenameAttribute>().Name);
                }
                else
                {
                    _codeBuilder.AppendFormat("property {0} {1}\n", ptype, field.NativeName);
                }
                _codeBuilder.AppendLine("{");

                _codeBuilder.AppendLine(field.ProtectionLevel.GetCLRProtectionName() + ":");
                _codeBuilder.AppendLine("\t" + ptype + " get();");

                if ( // SharedPtrs can be copied by value. Let all be copied by value just to be sure (field.PassedByType == PassedByType.Pointer || field.Type.IsValueType)
                    !IsReadOnly && !field.MemberType.HasAttribute <ReadOnlyForFieldsAttribute>() &&
                    !field.IsConst)
                {
                    _codeBuilder.AppendLine(field.ProtectionLevel.GetCLRProtectionName() + ":");
                    _codeBuilder.AppendLine("\tvoid set(" + ptype + " value);");
                }

                _codeBuilder.AppendLine("}");
            }
        }