19
19
package cn .maxpixel .mcdecompiler .mapping .processor ;
20
20
21
21
import cn .maxpixel .mcdecompiler .common .util .NamingUtil ;
22
+ import cn .maxpixel .mcdecompiler .common .util .Utils ;
22
23
import cn .maxpixel .mcdecompiler .mapping .NamespacedMapping ;
23
24
import cn .maxpixel .mcdecompiler .mapping .PairedMapping ;
24
25
import cn .maxpixel .mcdecompiler .mapping .collection .ClassMapping ;
28
29
import cn .maxpixel .mcdecompiler .mapping .component .StaticIdentifiable ;
29
30
import cn .maxpixel .mcdecompiler .mapping .format .MappingFormat ;
30
31
import cn .maxpixel .mcdecompiler .mapping .format .MappingFormats ;
32
+ import cn .maxpixel .mcdecompiler .mapping .trait .AccessTransformationTrait ;
33
+ import cn .maxpixel .mcdecompiler .mapping .trait .InheritanceTrait ;
31
34
import cn .maxpixel .mcdecompiler .mapping .trait .NamespacedTrait ;
32
35
import cn .maxpixel .mcdecompiler .mapping .util .MappingUtil ;
33
36
import cn .maxpixel .mcdecompiler .mapping .util .TinyUtil ;
@@ -98,9 +101,6 @@ private static String getName(String s) {
98
101
};
99
102
100
103
MappingProcessor .Classified <PairedMapping > CSRG = new MappingProcessor .Classified <>() {
101
- private static final Function <String , ClassMapping <PairedMapping >> COMPUTE_FUNC = name ->
102
- new ClassMapping <>(new PairedMapping (name ));
103
-
104
104
@ Override
105
105
public MappingFormat <PairedMapping , ClassifiedMapping <PairedMapping >> getFormat () {
106
106
return MappingFormats .CSRG ;
@@ -131,13 +131,13 @@ public ClassifiedMapping<PairedMapping> process(ObjectList<String> content) {
131
131
case 3 -> { // Field
132
132
PairedMapping fieldMapping = MappingUtil .Paired .o (sa [1 ], sa [2 ]);
133
133
synchronized (classes ) {
134
- classes .computeIfAbsent (sa [0 ], COMPUTE_FUNC ).addField (fieldMapping );
134
+ classes .computeIfAbsent (sa [0 ], MappingUtil . Paired . COMPUTE_DEFAULT_CLASS ).addField (fieldMapping );
135
135
}
136
136
}
137
137
case 4 -> { // Method
138
138
PairedMapping methodMapping = MappingUtil .Paired .duo (sa [1 ], sa [3 ], sa [2 ]);
139
139
synchronized (classes ) {
140
- classes .computeIfAbsent (sa [0 ], COMPUTE_FUNC ).addMethod (methodMapping );
140
+ classes .computeIfAbsent (sa [0 ], MappingUtil . Paired . COMPUTE_DEFAULT_CLASS ).addMethod (methodMapping );
141
141
}
142
142
}
143
143
default -> throw new IllegalArgumentException ("Is this a CSRG mapping file?" );
@@ -480,4 +480,113 @@ private static void error() {
480
480
throw new IllegalArgumentException ("Is this a Tiny v2 mapping file?" );
481
481
}
482
482
};
483
+
484
+ MappingProcessor .Classified <PairedMapping > PDME = new MappingProcessor .Classified <>() {
485
+ private static final char PARA = '¶' ;
486
+
487
+ @ Override
488
+ public MappingFormat <PairedMapping , ClassifiedMapping <PairedMapping >> getFormat () {
489
+ return MappingFormats .PDME ;
490
+ }
491
+
492
+ @ Override
493
+ public ClassifiedMapping <PairedMapping > process (ObjectList <String > content ) {
494
+ InheritanceTrait inheritanceMap = new InheritanceTrait ();
495
+ AccessTransformationTrait at = new AccessTransformationTrait ();
496
+ ClassifiedMapping <PairedMapping > mappings = new ClassifiedMapping <>(inheritanceMap , at );
497
+ Object2ObjectOpenHashMap <String , ClassMapping <PairedMapping >> classes = new Object2ObjectOpenHashMap <>(); // k: unmapped name
498
+ Object2ObjectOpenHashMap <String , PairedMapping > methodMap = new Object2ObjectOpenHashMap <>();
499
+ for (String line : content ) {
500
+ String [] parts = MappingUtil .split (line , PARA );
501
+ switch (parts [0 ]) {
502
+ case "Class" -> {
503
+ String unmapped = parts [1 ].replace ('.' , '/' );
504
+ String mapped = parts [2 ].replace ('.' , '/' );
505
+ classes .merge (unmapped , new ClassMapping <>(new PairedMapping (unmapped , mapped , new Documented (parts [5 ]))), (o , n ) -> {
506
+ n .addFields (o .getFields ());
507
+ n .addMethods (o .getMethods ());
508
+ return n ;
509
+ });
510
+ }
511
+ case "Def" -> getMethod (parts [1 ], parts [2 ], parts [5 ], classes , methodMap );
512
+ case "Var" -> {
513
+ int lastDot = parts [1 ].lastIndexOf ('.' );
514
+ String nameAndDesc = parts [1 ].substring (lastDot + 1 );
515
+ int colon = nameAndDesc .indexOf (':' );
516
+ PairedMapping field = MappingUtil .Paired .duo (nameAndDesc .substring (0 , colon ), parts [2 ],
517
+ nameAndDesc .substring (colon + 1 ));
518
+ field .addComponent (new Documented (parts [5 ]));
519
+ ClassMapping <PairedMapping > cm = classes .computeIfAbsent (parts [1 ].substring (0 , lastDot )
520
+ .replace ('.' , '/' ), MappingUtil .Paired .COMPUTE_DEFAULT_CLASS );
521
+ cm .addField (field );
522
+ }
523
+ case "Param" -> {
524
+ PairedMapping local = new PairedMapping (parts [1 ], parts [2 ]);
525
+ local .addComponent (new Documented (parts [5 ]));
526
+ PairedMapping method = getMethod (parts [3 ], null , null , classes , methodMap );
527
+ LocalVariableTable .Paired lvt = method .getComponent (LocalVariableTable .Paired .class );
528
+ if (lvt == null ) {// TODO
529
+ lvt = new LocalVariableTable .Paired ();
530
+ method .addComponent (lvt );
531
+ }
532
+ lvt .setLocalVariable (Integer .parseInt (parts [4 ]), local );
533
+ }
534
+ case "Include" , "Incluir" -> inheritanceMap .put (parts [1 ].replace ('.' , '/' ),
535
+ Utils .mapArray (MappingUtil .split (parts [2 ], ',' ), String []::new ,
536
+ s -> s .replace ('.' , '/' )));
537
+ case "AccessFlag" , "BanderaDeAcceso" -> {
538
+ if (parts [1 ].contains (":" )) { // field
539
+ } else if (parts [1 ].contains ("(" )) { // method
540
+ } else { // class
541
+ at .add (parts [1 ].replace ('.' , '/' ), parts [2 ].startsWith ("0x" ) ?
542
+ Integer .parseInt (parts [2 ].substring (2 ), 16 ) : Integer .parseInt (parts [2 ]));
543
+ }
544
+ }
545
+ }
546
+ }
547
+ mappings .classes .addAll (classes .values ());
548
+ for (var cm : mappings .classes ) parseOuterClass (cm .mapping .unmappedName , classes );
549
+ return mappings ;
550
+ }
551
+
552
+ private static String parseOuterClass (String unmapped , Object2ObjectOpenHashMap <String , ClassMapping <PairedMapping >> classes ) {
553
+ ClassMapping <PairedMapping > cm = classes .get (unmapped );
554
+ String mapped = cm == null ? unmapped : cm .mapping .mappedName ;
555
+ int lastDollar = unmapped .lastIndexOf ('$' );
556
+ if (lastDollar < 0 ) return mapped ;
557
+ String outer = unmapped .substring (0 , lastDollar );
558
+ if (cm != null ) {
559
+ if (mapped .contains ("$" )) return mapped ;
560
+ String ret = parseOuterClass (outer , classes ) + '$' + mapped ;
561
+ cm .mapping .mappedName = ret ;
562
+ return ret ;
563
+ }
564
+ String ret = parseOuterClass (outer , classes ) + '$' + unmapped .substring (lastDollar + 1 );
565
+ classes .put (unmapped , new ClassMapping <>(new PairedMapping (unmapped , ret )));
566
+ return ret ;
567
+ }
568
+
569
+ private static PairedMapping getMethod (String original , String mapped , String docs ,
570
+ Object2ObjectOpenHashMap <String , ClassMapping <PairedMapping >> classes ,
571
+ Object2ObjectOpenHashMap <String , PairedMapping > methodMap ) {
572
+ return methodMap .compute (original , (s , old ) -> {
573
+ if (old != null ) {
574
+ if (docs != null ) old .addComponent (new Documented (docs ));
575
+ if (mapped != null ) old .mappedName = mapped ;
576
+ return old ;
577
+ }
578
+ int lastDot = s .lastIndexOf ('.' );
579
+ String nameAndDesc = s .substring (lastDot + 1 );
580
+ int bracket = nameAndDesc .indexOf ('(' );
581
+ String name = nameAndDesc .substring (0 , bracket );
582
+ PairedMapping method = MappingUtil .Paired .duo (name , mapped == null ? name : mapped ,
583
+ nameAndDesc .substring (bracket ));
584
+ if (docs != null ) method .addComponent (new Documented (docs ));
585
+ ClassMapping <PairedMapping > cm = classes .computeIfAbsent (s .substring (0 , lastDot )
586
+ .replace ('.' , '/' ), MappingUtil .Paired .COMPUTE_DEFAULT_CLASS );
587
+ cm .addMethod (method );
588
+ return method ;
589
+ });
590
+ }
591
+ };
483
592
}
0 commit comments