Ejemplo n.º 1
0
 public CodegenSubstitutionParamEntry(
     CodegenField field,
     string name,
     Type type)
 {
     Field = field;
     Name = name;
     Type = type;
 }
Ejemplo n.º 2
0
        // --------------------------------------------------------------------------------

        private CodegenField AddFieldUnsharedInternal(
            bool isFinal,
            Type type,
            CodegenExpression initCtorScoped)
        {
            var memberNumber = _currentMemberNumber++;
            var name = CodegenNamespaceScopeNames.AnyField(memberNumber);
            var member = new CodegenField(FieldsClassName, name, type, null, isFinal);
            _fieldsUnshared.Put(member, initCtorScoped);
            return member;
        }
Ejemplo n.º 3
0
        public CodegenField AddSubstitutionParameter(
            string name,
            Type type)
        {
            var mixed = false;
            if (name == null) {
                if (!_substitutionParamsByName.IsEmpty()) {
                    mixed = true;
                }
            }
            else if (!SubstitutionParamsByNumber.IsEmpty()) {
                mixed = true;
            }

            if (mixed) {
                throw new ArgumentException("Mixing named and unnamed substitution parameters is not allowed");
            }

            if (name != null) {
                var entry = _substitutionParamsByName.Get(name);
                if (entry != null && !TypeHelper.IsSubclassOrImplementsInterface(type, entry.Type)) {
                    throw new ArgumentException(
                        "Substitution parameter '" +
                        name +
                        "' of type '" +
                        entry.Type +
                        "' cannot be assigned type '" +
                        type +
                        "'");
                }
            }

            CodegenField member;
            if (name == null) {
                var assigned = ++_currentSubstitutionParamNumber;
                var fieldName = CodegenNamespaceScopeNames.AnySubstitutionParam(assigned);
                member = new CodegenField(FieldsClassName, fieldName, type, null, false);
                SubstitutionParamsByNumber.Add(new CodegenSubstitutionParamEntry(member, name, type));
            }
            else {
                var existing = _substitutionParamsByName.Get(name);
                if (existing == null) {
                    var assigned = ++_currentSubstitutionParamNumber;
                    var fieldName = CodegenNamespaceScopeNames.AnySubstitutionParam(assigned);
                    member = new CodegenField(FieldsClassName, fieldName, type, null, false);
                    _substitutionParamsByName.Put(name, new CodegenSubstitutionParamEntry(member, name, type));
                }
                else {
                    member = existing.Field;
                }
            }

            return member;
        }
Ejemplo n.º 4
0
        public CodegenExpressionInstanceField AddInstanceFieldUnshared(
            CodegenExpression instance,
            bool isFinal,
            Type type,
            CodegenExpression initCtorScoped)
        {
            if (FieldsClassName == null)
            {
                throw new IllegalStateException("No fields class name");
            }

            CodegenField unshared = AddFieldUnsharedInternal(isFinal, type, initCtorScoped);
            return InstanceField(instance, unshared);
        }
Ejemplo n.º 5
0
        public CodegenExpressionField AddOrGetFieldWellKnown(
            CodegenFieldName fieldName,
            Type type)
        {
            var existing = _fieldsNamed.Get(fieldName);
            if (existing != null) {
                if (existing.Type != type) {
                    throw new IllegalStateException(
                        "Field '" +
                        fieldName +
                        "' already registered with a different type, registered with " +
                        existing.Type.GetSimpleName() +
                        " but provided " +
                        type.GetSimpleName());
                }

                return Field(existing);
            }

            var field = new CodegenField(FieldsClassName, fieldName.Name, type, null, false);
            _fieldsNamed.Put(fieldName, field);
            return Field(field);
        }