private void AnnotateDerivedTypes(DataModelBaseTypeBuilder baseBuilder, string derivedName)
 {
     if (!this.TryAnnotateDerivedType(_compiledTypes, baseBuilder, derivedName) && !this.TryAnnotateDerivedType(_compiledBases, baseBuilder, derivedName))
     {
         throw new G4ParseFailureException(baseBuilder.DeclSymbol.GetLocation(), Strings.UnresolvedDerivedType, derivedName);
     }
 }
        private bool TryAnnotateDerivedType <T>(Dictionary <string, T> lookupTable, DataModelBaseTypeBuilder baseBuilder, string derivedName)
            where T : DataModelTypeBuilder
        {
            T derived;

            if (lookupTable.TryGetValue(derivedName, out derived))
            {
                string existingBase = derived.Base;
                if (existingBase != null && existingBase != baseBuilder.CSharpName)
                {
                    DataModelBaseTypeBuilder existingBaseBuilder = _compiledBases.Values.First(compiledBase => compiledBase.CSharpName == baseBuilder.CSharpName);

                    throw new G4ParseFailureException(baseBuilder.DeclSymbol.GetLocation(), Strings.TypeAlreadyTaken,
                                                      derived.G4DeclaredName, existingBaseBuilder.G4DeclaredName, baseBuilder.G4DeclaredName);
                }

                derived.Base = baseBuilder.CSharpName;
                return(true);
            }

            return(false);
        }