📄 dompersistence.cs
字号:
c.Modifiers = (ModifierEnum)reader.ReadInt32();
c.Flags = reader.ReadByte();
c.ClassType = (ClassType)reader.ReadByte();
ReadAttributes(c);
count = reader.ReadInt32();
for (int i = 0; i < count; i++) {
DefaultClass innerClass = new DefaultClass(c.CompilationUnit, c);
innerClass.FullyQualifiedName = reader.ReadString();
c.InnerClasses.Add(innerClass);
ReadClass(innerClass);
}
this.currentClass = c;
count = reader.ReadInt32();
for (int i = 0; i < count; i++) {
c.Methods.Add(ReadMethod());
}
count = reader.ReadInt32();
for (int i = 0; i < count; i++) {
c.Properties.Add(ReadProperty());
}
count = reader.ReadInt32();
for (int i = 0; i < count; i++) {
c.Events.Add(ReadEvent());
}
count = reader.ReadInt32();
for (int i = 0; i < count; i++) {
c.Fields.Add(ReadField());
}
this.currentClass = null;
}
#endregion
#region Write/Read return types / Collect strings
/// <summary>
/// Finds all return types used in the class collection and adds the unknown ones
/// to the externalTypeIndices and externalTypes collections.
/// </summary>
void CreateExternalTypeList(List<ClassNameTypeCountPair> externalTypes,
List<string> stringList,
int classCount, ICollection<IClass> classes)
{
foreach (IClass c in classes) {
CreateExternalTypeList(externalTypes, stringList, classCount, c.InnerClasses);
AddStrings(stringList, c.Attributes);
foreach (IReturnType returnType in c.BaseTypes) {
AddExternalType(returnType, externalTypes, classCount);
}
foreach (ITypeParameter tp in c.TypeParameters) {
AddString(stringList, tp.Name);
foreach (IReturnType returnType in tp.Constraints) {
AddExternalType(returnType, externalTypes, classCount);
}
}
foreach (IField f in c.Fields) {
AddStrings(stringList, f);
AddExternalType(f.ReturnType, externalTypes, classCount);
}
foreach (IEvent f in c.Events) {
AddStrings(stringList, f);
AddExternalType(f.ReturnType, externalTypes, classCount);
}
foreach (IProperty p in c.Properties) {
AddStrings(stringList, p);
AddExternalType(p.ReturnType, externalTypes, classCount);
foreach (IParameter parameter in p.Parameters) {
AddString(stringList, parameter.Name);
AddStrings(stringList, parameter.Attributes);
AddExternalType(parameter.ReturnType, externalTypes, classCount);
}
}
foreach (IMethod m in c.Methods) {
AddStrings(stringList, m);
AddExternalType(m.ReturnType, externalTypes, classCount);
foreach (IParameter parameter in m.Parameters) {
AddString(stringList, parameter.Name);
AddStrings(stringList, parameter.Attributes);
AddExternalType(parameter.ReturnType, externalTypes, classCount);
}
foreach (ITypeParameter tp in m.TypeParameters) {
AddString(stringList, tp.Name);
foreach (IReturnType returnType in tp.Constraints) {
AddExternalType(returnType, externalTypes, classCount);
}
}
}
}
}
void AddStrings(List<string> stringList, IMember member)
{
AddString(stringList, member.Name);
AddStrings(stringList, member.Attributes);
}
void AddString(List<string> stringList, string text)
{
text = text ?? string.Empty;
if (!stringDict.ContainsKey(text)) {
stringDict.Add(text, stringList.Count);
stringList.Add(text);
}
}
void AddExternalType(IReturnType rt, List<ClassNameTypeCountPair> externalTypes, int classCount)
{
if (rt.IsDefaultReturnType) {
ClassNameTypeCountPair pair = new ClassNameTypeCountPair(rt);
if (!classIndices.ContainsKey(pair)) {
classIndices.Add(pair, externalTypes.Count + classCount);
externalTypes.Add(pair);
}
} else if (rt is GenericReturnType) {
// ignore
} else if (rt.ArrayDimensions > 0) {
AddExternalType(rt.ArrayElementType, externalTypes, classCount);
} else if (rt.TypeArguments != null) {
AddExternalType(rt.UnboundType, externalTypes, classCount);
foreach (IReturnType typeArgument in rt.TypeArguments) {
AddExternalType(typeArgument, externalTypes, classCount);
}
} else {
LoggingService.Warn("Unknown return type: " + rt.ToString());
}
}
const int ArrayRTCode = -1;
const int ConstructedRTCode = -2;
const int TypeGenericRTCode = -3;
const int MethodGenericRTCode = -4;
const int NullRTReferenceCode = -5;
const int VoidRTCode = -6;
void WriteType(IReturnType rt)
{
if (rt == null) {
writer.Write(NullRTReferenceCode);
return;
}
if (rt.IsDefaultReturnType) {
string name = rt.FullyQualifiedName;
if (name == "System.Void") {
writer.Write(VoidRTCode);
} else {
writer.Write(classIndices[new ClassNameTypeCountPair(rt)]);
}
} else if (rt is GenericReturnType) {
GenericReturnType grt = (GenericReturnType)rt;
if (grt.TypeParameter.Method != null) {
writer.Write(MethodGenericRTCode);
} else {
writer.Write(TypeGenericRTCode);
}
writer.Write(grt.TypeParameter.Index);
} else if (rt.ArrayDimensions > 0) {
writer.Write(ArrayRTCode);
writer.Write(rt.ArrayDimensions);
WriteType(rt.ArrayElementType);
} else if (rt.TypeArguments != null) {
writer.Write(ConstructedRTCode);
WriteType(rt.UnboundType);
writer.Write((byte)rt.TypeArguments.Count);
foreach (IReturnType typeArgument in rt.TypeArguments) {
WriteType(typeArgument);
}
} else {
writer.Write(NullRTReferenceCode);
LoggingService.Warn("Unknown return type: " + rt.ToString());
}
}
// outerClass and outerMethod are required for generic return types
IReturnType ReadType()
{
int index = reader.ReadInt32();
switch (index) {
case ArrayRTCode:
int dimensions = reader.ReadInt32();
return new ArrayReturnType(ReadType(), dimensions);
case ConstructedRTCode:
IReturnType baseType = ReadType();
IReturnType[] typeArguments = new IReturnType[reader.ReadByte()];
for (int i = 0; i < typeArguments.Length; i++) {
typeArguments[i] = ReadType();
}
return new ConstructedReturnType(baseType, typeArguments);
case TypeGenericRTCode:
return new GenericReturnType(currentClass.TypeParameters[reader.ReadInt32()]);
case MethodGenericRTCode:
return new GenericReturnType(currentMethod.TypeParameters[reader.ReadInt32()]);
case NullRTReferenceCode:
return null;
case VoidRTCode:
return ReflectionReturnType.Void;
default:
return types[index];
}
}
#endregion
#region Write/Read class member
void WriteString(string text)
{
text = text ?? string.Empty;
writer.Write(stringDict[text]);
}
string ReadString()
{
return stringArray[reader.ReadInt32()];
}
void WriteMember(IMember m)
{
WriteString(m.Name);
writer.Write((int)m.Modifiers);
WriteAttributes(m.Attributes);
if (!(m is IMethod)) {
// method must store ReturnType AFTER Template definitions
WriteType(m.ReturnType);
}
}
void ReadMember(AbstractMember m)
{
// name is already read by the method that calls the member constructor
m.Modifiers = (ModifierEnum)reader.ReadInt32();
ReadAttributes(m);
if (!(m is IMethod)) {
m.ReturnType = ReadType();
}
}
#endregion
#region Write/Read attributes
void WriteAttributes(IList<IAttribute> attributes)
{
writer.Write((ushort)attributes.Count);
foreach (IAttribute a in attributes) {
WriteString(a.Name);
writer.Write((byte)a.AttributeTarget);
}
}
void AddStrings(List<string> stringList, IList<IAttribute> attributes)
{
foreach (IAttribute a in attributes) {
AddString(stringList, a.Name);
}
}
void ReadAttributes(DefaultParameter parameter)
{
int count = reader.ReadUInt16();
if (count > 0) {
ReadAttributes(parameter.Attributes, count);
} else {
parameter.Attributes = DefaultAttribute.EmptyAttributeList;
}
}
void ReadAttributes(AbstractDecoration decoration)
{
int count = reader.ReadUInt16();
if (count > 0) {
ReadAttributes(decoration.Attributes, count);
} else {
decoration.Attributes = DefaultAttribute.EmptyAttributeList;
}
}
void ReadAttributes(IList<IAttribute> attributes, int count)
{
for (int i = 0; i < count; i++) {
string name = ReadString();
attributes.Add(new DefaultAttribute(name, (AttributeTarget)reader.ReadByte()));
}
}
#endregion
#region Write/Read parameters
void WriteParameters(IList<IParameter> parameters)
{
writer.Write((ushort)parameters.Count);
foreach (IParameter p in parameters) {
WriteString(p.Name);
WriteType(p.ReturnType);
writer.Write((byte)p.Modifiers);
WriteAttributes(p.Attributes);
}
}
void ReadParameters(DefaultMethod m)
{
int count = reader.ReadUInt16();
if (count > 0) {
ReadParameters(m.Parameters, count);
} else {
m.Parameters = DefaultParameter.EmptyParameterList;
}
}
void ReadParameters(DefaultProperty m)
{
int count = reader.ReadUInt16();
if (count > 0) {
ReadParameters(m.Parameters, count);
} else {
m.Parameters = DefaultParameter.EmptyParameterList;
}
}
void ReadParameters(IList<IParameter> parameters, int count)
{
for (int i = 0; i < count; i++) {
string name = ReadString();
DefaultParameter p = new DefaultParameter(name, ReadType(), DomRegion.Empty);
p.Modifiers = (ParameterModifiers)reader.ReadByte();
ReadAttributes(p);
parameters.Add(p);
}
}
#endregion
#region Write/Read Method
IMethod currentMethod;
void WriteMethod(IMethod m)
{
currentMethod = m;
WriteMember(m);
WriteTemplates(m.TypeParameters);
WriteType(m.ReturnType);
writer.Write(m.IsExtensionMethod);
WriteParameters(m.Parameters);
currentMethod = null;
}
IMethod ReadMethod()
{
DefaultMethod m = new DefaultMethod(currentClass, ReadString());
currentMethod = m;
ReadMember(m);
int count = reader.ReadByte();
for (int i = 0; i < count; i++) {
m.TypeParameters.Add(new DefaultTypeParameter(m, ReadString(), i));
}
if (count > 0) {
foreach (ITypeParameter typeParameter in m.TypeParameters) {
count = reader.ReadInt32();
for (int i = 0; i < count; i++) {
typeParameter.Constraints.Add(ReadType());
}
}
} else {
m.TypeParameters = DefaultTypeParameter.EmptyTypeParameterList;
}
m.ReturnType = ReadType();
m.IsExtensionMethod = reader.ReadBoolean();
ReadParameters(m);
currentMethod = null;
return m;
}
#endregion
#region Write/Read Property
void WriteProperty(IProperty p)
{
WriteMember(p);
DefaultProperty dp = p as DefaultProperty;
if (dp != null) {
writer.Write(dp.accessFlags);
} else {
writer.Write((byte)0);
}
WriteParameters(p.Parameters);
}
IProperty ReadProperty()
{
DefaultProperty p = new DefaultProperty(currentClass, ReadString());
ReadMember(p);
p.accessFlags = reader.ReadByte();
ReadParameters(p);
return p;
}
#endregion
#region Write/Read Event
void WriteEvent(IEvent p)
{
WriteMember(p);
}
IEvent ReadEvent()
{
DefaultEvent p = new DefaultEvent(currentClass, ReadString());
ReadMember(p);
return p;
}
#endregion
#region Write/Read Field
void WriteField(IField p)
{
WriteMember(p);
}
IField ReadField()
{
DefaultField p = new DefaultField(currentClass, ReadString());
ReadMember(p);
return p;
}
#endregion
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -