Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit9606209

Browse files
vasily-kirichenkoKevinRansom
authored andcommitted
Go to C# symbols (#3357)
* go to C# symbols* fix tests* cleanup* fix tests* support field, events and constructors* fix tests* implement IVsSymbolicNavigationNotify* cleanup* fix* cleanup* Improve package definition specs fro F# VS Package* Fixed some bugs with nested types with fields/events* fix compilation* use AppTy AP* Add support for overloaded methods, generic methods, generic (nested) classes, constructors* Jump to property definition instead of getter/setter* Add ExternalSymbol to FSharp.Compiler.Service.fsproj* Fix FSharp.Compiler.Private.BuildFromSource.fsproj* address code review
1 parentcd23839 commit9606209

File tree

14 files changed

+417
-56
lines changed

14 files changed

+417
-56
lines changed

‎fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,12 @@
559559
<CompileInclude="$(FSharpSourcesRoot)\fsharp\vs\ServiceXmlDocParser.fs">
560560
<Link>Service/ServiceXmlDocParser.fs</Link>
561561
</Compile>
562+
<CompileInclude="$(FSharpSourcesRoot)\fsharp\vs\ExternalSymbol.fsi">
563+
<Link>Service/ExternalSymbol.fsi</Link>
564+
</Compile>
565+
<CompileInclude="$(FSharpSourcesRoot)\fsharp\vs\ExternalSymbol.fs">
566+
<Link>Service/ExternalSymbol.fs</Link>
567+
</Compile>
562568
<CompileInclude="$(FSharpSourcesRoot)\fsharp\vs\service.fsi">
563569
<Link>Service/service.fsi</Link>
564570
</Compile>

‎src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.BuildFromSource.fsproj‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,12 @@
558558
<CompileInclude="..\SimulatedMSBuildReferenceResolver.fs">
559559
<Link>Service/SimulatedMSBuildReferenceResolver.fs</Link>
560560
</Compile>
561+
<CompileInclude="..\vs\ExternalSymbol.fsi">
562+
<Link>Service/ExternalSymbol.fsi</Link>
563+
</Compile>
564+
<CompileInclude="..\vs\ExternalSymbol.fs">
565+
<Link>Service/ExternalSymbol.fs</Link>
566+
</Compile>
561567
<CompileInclude="..\vs\service.fsi">
562568
<Link>Service/service.fsi</Link>
563569
</Compile>

‎src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,12 @@
594594
<CompileInclude="..\SimulatedMSBuildReferenceResolver.fs">
595595
<Link>Service/SimulatedMSBuildReferenceResolver.fs</Link>
596596
</Compile>
597+
<CompileInclude="..\vs\ExternalSymbol.fsi">
598+
<Link>Service/ExternalSymbol.fsi</Link>
599+
</Compile>
600+
<CompileInclude="..\vs\ExternalSymbol.fs">
601+
<Link>Service/ExternalSymbol.fs</Link>
602+
</Compile>
597603
<CompileInclude="..\vs\service.fsi">
598604
<Link>Service/service.fsi</Link>
599605
</Compile>

‎src/fsharp/symbols/SymbolHelpers.fs‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,11 +394,12 @@ module internal SymbolHelpers =
394394
| Item.SetterArg(_,item)-> rangeOfItem g preferFlag item
395395
| Item.ArgName(id,_,_)-> Some id.idRange
396396
| Item.CustomOperation(_,_,implOpt)-> implOpt|> Option.bind(rangeOfMethInfo g preferFlag)
397+
| Item.ImplicitOp(_,{contents= Some(TraitConstraintSln.FSMethSln(_, vref,_))})-> Some vref.Range
397398
| Item.ImplicitOp_-> None
398-
| Item.NewDef id-> Some id.idRange
399399
| Item.UnqualifiedType tcrefs-> tcrefs|> List.tryPick(rangeOfEntityRef preferFlag>> Some)
400400
| Item.DelegateCtor typ
401401
| Item.FakeInterfaceCtor typ-> typ|> tryNiceEntityRefOfTy|> Option.map(rangeOfEntityRef preferFlag)
402+
| Item.NewDef_-> None
402403

403404
// Provided type definitions do not have a useful F# CCU for the purposes of goto-definition.
404405
letcomputeCcuOfTyconRef(tcref:TyconRef)=

‎src/fsharp/vs/ExternalSymbol.fs‎

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
2+
3+
namespaceMicrosoft.FSharp.Compiler.SourceCodeServices
4+
5+
openFSharp.Reflection
6+
openMicrosoft.FSharp.Compiler.AbstractIL.IL
7+
openSystem.Diagnostics
8+
9+
moduleprivateOption=
10+
11+
letofOptionList(xs:'a option list):'a list option=
12+
13+
if xs|> List.forall Option.isSomethen
14+
xs|> List.map Option.get|> Some
15+
else
16+
None
17+
18+
/// Represents a type in an external (non F#) assembly.
19+
[<RequireQualifiedAccess>]
20+
typeExternalType=
21+
/// Type defined in non-F# assembly.
22+
| TypeoffullName:string*genericArgs:ExternalTypelist
23+
/// Array of type that is defined in non-F# assembly.
24+
| Arrayofinner:ExternalType
25+
/// Pointer defined in non-F# assembly.
26+
| Pointerofinner:ExternalType
27+
/// Type variable defined in non-F# assembly.
28+
| TypeVaroftypeName:string
29+
overridethis.ToString()=
30+
match thiswith
31+
| Type(name, genericArgs)->
32+
match genericArgswith
33+
|[]->""
34+
| args->
35+
args
36+
|> List.map(sprintf"%O")
37+
|> String.concat","
38+
|> sprintf"<%s>"
39+
|> sprintf"%s%s" name
40+
| Array inner-> sprintf"%O[]" inner
41+
| Pointer inner-> sprintf"&%O" inner
42+
| TypeVar name-> sprintf"'%s" name
43+
44+
moduleExternalType=
45+
let recinternaltryOfILType(typeVarNames:string array)(ilType:ILType)=
46+
47+
match ilTypewith
48+
| ILType.Array(_, inner)->
49+
tryOfILType typeVarNames inner|> Option.map ExternalType.Array
50+
| ILType.Boxed tyspec
51+
| ILType.Value tyspec->
52+
tyspec.GenericArgs
53+
|> List.map(tryOfILType typeVarNames)
54+
|> Option.ofOptionList
55+
|> Option.map(fun genericArgs-> ExternalType.Type(tyspec.FullName, genericArgs))
56+
| ILType.Ptr inner->
57+
tryOfILType typeVarNames inner|> Option.map ExternalType.Pointer
58+
| ILType.TypeVar ordinal->
59+
typeVarNames
60+
|> Array.tryItem(int ordinal)
61+
|> Option.map(fun typeVarName-> ExternalType.TypeVar typeVarName)
62+
|_->
63+
None
64+
65+
[<RequireQualifiedAccess>]
66+
typeParamTypeSymbol=
67+
| ParamofExternalType
68+
| ByrefofExternalType
69+
overridethis.ToString()=
70+
match thiswith
71+
| Param t-> t.ToString()
72+
| Byref t-> sprintf"ref%O" t
73+
74+
moduleParamTypeSymbol=
75+
let recinternaltryOfILType(typeVarNames:string array)=
76+
function
77+
| ILType.Byref inner-> ExternalType.tryOfILType typeVarNames inner|> Option.map ParamTypeSymbol.Byref
78+
| ilType-> ExternalType.tryOfILType typeVarNames ilType|> Option.map ParamTypeSymbol.Param
79+
80+
letinternaltryOfILTypes typeVarNames ilTypes=
81+
ilTypes|> List.map(tryOfILType typeVarNames)|> Option.ofOptionList
82+
83+
[<RequireQualifiedAccess>]
84+
[<DebuggerDisplay"{ToDebuggerDisplay(),nq}">]
85+
typeExternalSymbol=
86+
| TypeoffullName:string
87+
| ConstructoroftypeName:string*args:ParamTypeSymbollist
88+
| MethodoftypeName:string*name:string*paramSyms:ParamTypeSymbollist*genericArity:int
89+
| FieldoftypeName:string*name:string
90+
| EventoftypeName:string*name:string
91+
| PropertyoftypeName:string*name:string
92+
overridethis.ToString()=
93+
match thiswith
94+
| Type fullName-> fullName
95+
| Constructor(typeName, args)->
96+
args
97+
|> List.map(sprintf"%O")
98+
|> String.concat","
99+
|> sprintf"%s..ctor(%s)" typeName
100+
| Method(typeName, name, args, genericArity)->
101+
letgenericAritySuffix=
102+
if genericArity>0then sprintf"`%d" genericArity
103+
else""
104+
105+
args
106+
|> List.map(sprintf"%O")
107+
|> String.concat","
108+
|> sprintf"%s.%s%s(%s)" typeName name genericAritySuffix
109+
| Field(typeName, name)
110+
| Event(typeName, name)
111+
| Property(typeName, name)->
112+
sprintf"%s.%s" typeName name
113+
114+
memberinternalthis.ToDebuggerDisplay()=
115+
letcaseInfo,_= FSharpValue.GetUnionFields(this, typeof<ExternalSymbol>)
116+
sprintf"%s%O" caseInfo.Name this

‎src/fsharp/vs/ExternalSymbol.fsi‎

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
2+
3+
namespaceMicrosoft.FSharp.Compiler.SourceCodeServices
4+
5+
openFSharp.Reflection
6+
openMicrosoft.FSharp.Compiler.AbstractIL.IL
7+
8+
/// Represents a type in an external (non F#) assembly.
9+
[<RequireQualifiedAccess>]
10+
typeExternalType=
11+
/// Type defined in non-F# assembly.
12+
| TypeoffullName:string*genericArgs:ExternalTypelist
13+
/// Array of type that is defined in non-F# assembly.
14+
| Arrayofinner:ExternalType
15+
/// Pointer defined in non-F# assembly.
16+
| Pointerofinner:ExternalType
17+
/// Type variable defined in non-F# assembly.
18+
| TypeVaroftypeName:string
19+
overrideToString:unit->string
20+
21+
module ExternalType=
22+
valinternaltryOfILType:string array->ILType->ExternalType option
23+
24+
25+
/// Represents the type of a single method parameter
26+
[<RequireQualifiedAccess>]
27+
typeParamTypeSymbol=
28+
| ParamofExternalType
29+
| ByrefofExternalType
30+
overrideToString:unit->string
31+
32+
module ParamTypeSymbol=
33+
valinternaltryOfILType:string array->ILType->ParamTypeSymbol option
34+
valinternaltryOfILTypes:string array->ILType list->ParamTypeSymbol list option
35+
36+
37+
/// Represents a symbol in an external (non F#) assembly
38+
[<RequireQualifiedAccess>]
39+
typeExternalSymbol=
40+
| TypeoffullName:string
41+
| ConstructoroftypeName:string*args:ParamTypeSymbollist
42+
| MethodoftypeName:string*name:string*paramSyms:ParamTypeSymbollist*genericArity:int
43+
| FieldoftypeName:string*name:string
44+
| EventoftypeName:string*name:string
45+
| PropertyoftypeName:string*name:string
46+
overrideToString:unit->string
47+
memberinternalToDebuggerDisplay:unit->string

‎src/fsharp/vs/service.fs‎

Lines changed: 96 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ open Microsoft.FSharp.Core.Printf
1717
openMicrosoft.FSharp.Compiler
1818
openMicrosoft.FSharp.Compiler.AbstractIL
1919
openMicrosoft.FSharp.Compiler.AbstractIL.IL
20-
openMicrosoft.FSharp.Compiler.AbstractIL.Diagnostics
20+
openMicrosoft.FSharp.Compiler.AbstractIL.Diagnostics
2121
openMicrosoft.FSharp.Compiler.AbstractIL.Internal
2222
openMicrosoft.FSharp.Compiler.AbstractIL.Internal.Library
2323

@@ -88,12 +88,14 @@ type FSharpFindDeclFailureReason =
8888
// trying to find declaration of ProvidedMember without TypeProviderDefinitionLocationAttribute
8989
| ProvidedMemberofstring
9090

91+
[<RequireQualifiedAccess>]
9192
typeFSharpFindDeclResult=
9293
/// declaration not found + reason
9394
| DeclNotFoundofFSharpFindDeclFailureReason
9495
/// found declaration
9596
| DeclFoundofrange
96-
97+
/// Indicates an external declaration was found
98+
| ExternalDeclofassembly:string*externalSym:ExternalSymbol
9799

98100
/// This type is used to describe what was found during the name resolution.
99101
/// (Depending on the kind of the items, we may stop processing or continue to find better items)
@@ -1096,50 +1098,107 @@ type TypeCheckInfo
10961098
(fun msg->
10971099
Trace.TraceInformation(sprintf"FCS: recovering from error in GetMethodsAsSymbols: '%s'" msg)
10981100
None)
1099-
1101+
11001102
memberscope.GetDeclarationLocation(ctok,line,lineStr,colAtEndOfNames,names,preferFlag)=
11011103
ErrorScope.Protect Range.range0
11021104
(fun()->
11031105
match GetDeclItemsForNamesAtPosition(ctok, None,Some(names), None, line, lineStr, colAtEndOfNames, ResolveTypeNamesToCtors,ResolveOverloads.Yes,(fun()->[]),fun _->false)with
11041106
| None
11051107
| Some([],_,_,_)-> FSharpFindDeclResult.DeclNotFound(FSharpFindDeclFailureReason.Unknown"")
1106-
| Some(item::_,_,_,_)->
1107-
1108-
// For IL-based entities, switch to a different item. This is because
1109-
// rangeOfItem, ccuOfItem don't work on IL methods or fields.
1110-
//
1111-
// Later comment: to be honest, they aren't going to work on these new items either.
1112-
// This is probably old code from when we supported 'go to definition' generating IL metadata.
1113-
letitem=
1108+
| Some(item::_,_,_,_)->
1109+
letgetTypeVarNames(ilinfo:ILMethInfo)=
1110+
letclassTypeParams= ilinfo.DeclaringTyconRef.ILTyconRawMetadata.GenericParams|> List.map(fun paramDef-> paramDef.Name)
1111+
letmethodTypeParams= ilinfo.FormalMethodTypars|> List.map(fun typ-> typ.Name)
1112+
classTypeParams@ methodTypeParams|> Array.ofList
1113+
1114+
letresult=
11141115
match item.Itemwith
1115-
| Item.MethodGroup(_,(ILMeth(_,ilinfo,_))::_,_)
1116-
| Item.CtorGroup(_,(ILMeth(_,ilinfo,_))::_)-> Item.Types("",[ ilinfo.ApparentEnclosingType])
1117-
| Item.ILField(ILFieldInfo(typeInfo,_))-> Item.Types("",[ typeInfo.ToType])
1118-
| Item.ImplicitOp(_,{contents= Some(TraitConstraintSln.FSMethSln(_, vref,_))})-> Item.Value(vref)
1119-
|_-> item.Item
1120-
1121-
letfail defaultReason=
1122-
match itemwith
1116+
| Item.CtorGroup(_,(ILMeth(_,ilinfo,_))::_)->
1117+
match ilinfo.MetadataScopewith
1118+
| ILScopeRef.Assembly assref->
1119+
lettypeVarNames= getTypeVarNames ilinfo
1120+
ParamTypeSymbol.tryOfILTypes typeVarNames ilinfo.ILMethodRef.ArgTypes
1121+
|> Option.map(fun args->
1122+
letexternalSym= ExternalSymbol.Constructor(ilinfo.ILMethodRef.EnclosingTypeRef.FullName, args)
1123+
FSharpFindDeclResult.ExternalDecl(assref.Name, externalSym))
1124+
|_-> None
1125+
1126+
| Item.MethodGroup(name,(ILMeth(_,ilinfo,_))::_,_)->
1127+
match ilinfo.MetadataScopewith
1128+
| ILScopeRef.Assembly assref->
1129+
lettypeVarNames= getTypeVarNames ilinfo
1130+
ParamTypeSymbol.tryOfILTypes typeVarNames ilinfo.ILMethodRef.ArgTypes
1131+
|> Option.map(fun args->
1132+
letexternalSym= ExternalSymbol.Method(ilinfo.ILMethodRef.EnclosingTypeRef.FullName, name, args, ilinfo.ILMethodRef.GenericArity)
1133+
FSharpFindDeclResult.ExternalDecl(assref.Name, externalSym))
1134+
|_-> None
1135+
1136+
| Item.Property(name, ILProp(_, propInfo)::_)->
1137+
letmethInfo=
1138+
if propInfo.HasGetterthen Some(propInfo.GetterMethod g)
1139+
elif propInfo.HasSetterthen Some(propInfo.SetterMethod g)
1140+
else None
1141+
1142+
match methInfowith
1143+
| Some methInfo->
1144+
match methInfo.MetadataScopewith
1145+
| ILScopeRef.Assembly assref->
1146+
letexternalSym= ExternalSymbol.Property(methInfo.ILMethodRef.EnclosingTypeRef.FullName, name)
1147+
Some(FSharpFindDeclResult.ExternalDecl(assref.Name, externalSym))
1148+
|_-> None
1149+
| None-> None
1150+
1151+
| Item.ILField(ILFieldInfo(ILTypeInfo(tr,_,_,_)& typeInfo, fieldDef))whennot tr.IsLocalRef->
1152+
match typeInfo.ILScopeRefwith
1153+
| ILScopeRef.Assembly assref->
1154+
letexternalSym= ExternalSymbol.Field(typeInfo.ILTypeRef.FullName, fieldDef.Name)
1155+
Some(FSharpFindDeclResult.ExternalDecl(assref.Name, externalSym))
1156+
|_-> None
1157+
1158+
| Item.Event(ILEvent(_, ILEventInfo(ILTypeInfo(tr,_,_,_)& typeInfo, eventDef)))whennot tr.IsLocalRef->
1159+
match typeInfo.ILScopeRefwith
1160+
| ILScopeRef.Assembly assref->
1161+
letexternalSym= ExternalSymbol.Event(typeInfo.ILTypeRef.FullName, eventDef.Name)
1162+
Some(FSharpFindDeclResult.ExternalDecl(assref.Name, externalSym))
1163+
|_-> None
1164+
1165+
| Item.ImplicitOp(_,{contents= Some(TraitConstraintSln.FSMethSln(_,_vref,_))})->
1166+
//Item.Value(vref)
1167+
None
1168+
1169+
| Item.Types(_,[AppTy g(tr,_)])whennot tr.IsLocalRef->
1170+
match tr.TypeReprInfo, tr.PublicPathwith
1171+
| TILObjectRepr(TILObjectReprData(ILScopeRef.Assembly assref,_,_)), Some(PubPath parts)->
1172+
letfullName= parts|> String.concat"."
1173+
Some(FSharpFindDeclResult.ExternalDecl(assref.Name, ExternalSymbol.Type fullName))
1174+
|_-> None
1175+
|_-> None
1176+
1177+
match resultwith
1178+
| Some x-> x
1179+
| None->
1180+
letfail defaultReason=
1181+
match item.Itemwith
11231182
#if EXTENSIONTYPING
1124-
| SymbolHelpers.ItemIsProvidedType g(tcref)-> FSharpFindDeclResult.DeclNotFound(FSharpFindDeclFailureReason.ProvidedType(tcref.DisplayName))
1125-
| Item.CtorGroup(name, ProvidedMeth(_)::_)
1126-
| Item.MethodGroup(name, ProvidedMeth(_)::_,_)
1127-
| Item.Property(name, ProvidedProp(_)::_)-> FSharpFindDeclResult.DeclNotFound(FSharpFindDeclFailureReason.ProvidedMember(name))
1128-
| Item.Event(ProvidedEvent(_)as e)-> FSharpFindDeclResult.DeclNotFound(FSharpFindDeclFailureReason.ProvidedMember(e.EventName))
1129-
| Item.ILField(ProvidedField(_)as f)-> FSharpFindDeclResult.DeclNotFound(FSharpFindDeclFailureReason.ProvidedMember(f.FieldName))
1183+
| SymbolHelpers.ItemIsProvidedType g(tcref)-> FSharpFindDeclResult.DeclNotFound(FSharpFindDeclFailureReason.ProvidedType(tcref.DisplayName))
1184+
| Item.CtorGroup(name, ProvidedMeth(_)::_)
1185+
| Item.MethodGroup(name, ProvidedMeth(_)::_,_)
1186+
| Item.Property(name, ProvidedProp(_)::_)-> FSharpFindDeclResult.DeclNotFound(FSharpFindDeclFailureReason.ProvidedMember(name))
1187+
| Item.Event(ProvidedEvent(_)as e)-> FSharpFindDeclResult.DeclNotFound(FSharpFindDeclFailureReason.ProvidedMember(e.EventName))
1188+
| Item.ILField(ProvidedField(_)as f)-> FSharpFindDeclResult.DeclNotFound(FSharpFindDeclFailureReason.ProvidedMember(f.FieldName))
11301189
#endif
1131-
|_-> FSharpFindDeclResult.DeclNotFound defaultReason
1132-
1133-
match rangeOfItem g preferFlag itemwith
1134-
| None-> fail(FSharpFindDeclFailureReason.Unknown"")
1135-
| Some itemRange->
1136-
1137-
letprojectDir= Filename.directoryName(if projectFileName=""then mainInputFileNameelse projectFileName)
1138-
letfilename= fileNameOfItem g(Some projectDir) itemRange item
1139-
if FileSystem.SafeExists filenamethen
1140-
FSharpFindDeclResult.DeclFound(mkRange filename itemRange.Start itemRange.End)
1141-
else
1142-
fail FSharpFindDeclFailureReason.NoSourceCode// provided items may have TypeProviderDefinitionLocationAttribute that binds them to some location
1190+
|_-> FSharpFindDeclResult.DeclNotFound defaultReason
1191+
1192+
match rangeOfItem g preferFlag item.Itemwith
1193+
| None-> fail(FSharpFindDeclFailureReason.Unknown"")
1194+
| Some itemRange->
1195+
1196+
letprojectDir= Filename.directoryName(if projectFileName=""then mainInputFileNameelse projectFileName)
1197+
letfilename= fileNameOfItem g(Some projectDir) itemRange item.Item
1198+
if FileSystem.SafeExists filenamethen
1199+
FSharpFindDeclResult.DeclFound(mkRange filename itemRange.Start itemRange.End)
1200+
else
1201+
fail FSharpFindDeclFailureReason.NoSourceCode// provided items may have TypeProviderDefinitionLocationAttribute that binds them to some location
11431202
)
11441203
(fun msg->
11451204
Trace.TraceInformation(sprintf"FCS: recovering from error in GetDeclarationLocation: '%s'" msg)

‎src/fsharp/vs/service.fsi‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,9 @@ type internal FSharpFindDeclResult =
5959
/// Indicates a declaration location was not found, with an additional reason
6060
| DeclNotFoundofFSharpFindDeclFailureReason
6161
/// Indicates a declaration location was found
62-
| DeclFoundofrange
62+
| DeclFoundofrange
63+
/// Indicates an external declaration was found
64+
| ExternalDeclofassembly:string*externalSym:ExternalSymbol
6365

6466
/// Represents the checking context implied by the ProjectOptions
6567
[<Sealed>]

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp