File indexing completed on 2024-04-21 05:41:55

0001 #!/usr/bin/perl -w
0002 
0003 # David Faure <faure@kde.org>
0004 # KUrl -> QUrl
0005 # Usage: convert-kurl.pl *.h *.cpp
0006 
0007 # VERY IMPORTANT: add add_definitions(-DQT_NO_URL_CAST_FROM_STRING) to your CMakeLists.txt, to catch
0008 # passing a path to a QUrl via an implicit constructor (and port to QUrl(url) or QUrl::fromLocalFile(path)).
0009 
0010 # See https://community.kde.org/Frameworks/Porting_Notes#URL for more advice
0011 
0012 use strict;
0013 use File::Basename;
0014 use lib dirname($0);
0015 use functionUtilkde;
0016 my %urls = (); # shared between all files
0017 
0018 foreach my $file (@ARGV) {
0019 
0020     # I don't use functionUtilkde::substInFile because it touches all files, even those which were not modified.
0021     my $modified;
0022     my %varname = ();
0023     open(my $FILE, "<", $file) or warn "We can't open file $file:$!\n";
0024     my @l = map {
0025         my $orig = $_;
0026 
0027         s/#include <kurl.h>/#include <QUrl>/;
0028         s/#include <KUrl>/#include <QUrl>/;
0029         s/class KUrl\;/class QUrl\;/;
0030         s/KUrl\(\)\;/QUrl()\;/;
0031         s/KUrl::toPercentEncoding\b/QUrl::toPercentEncoding/;
0032         s/KUrl::fromPercentEncoding\b/QUrl::fromPercentEncoding/;
0033         s,KUrl::fromPath\b,QUrl::fromLocalFile,;
0034 
0035         if (/\s*KUrl::List\s+(\w+);/) {
0036            my $var = $1;
0037            $varname{$1} = 1;
0038         }
0039 
0040         if (/(\s*)(\w+)\.populateMimeData\s*\(\s*(\w+)\s*\);/) {
0041            my $var = $2;
0042            if (defined $varname{$var}) {
0043               my $urls = $3;
0044               my $indent = $1;
0045               $_ = $indent . "$urls->setUrls($var);\n";
0046            }
0047         }
0048         if (/KUrl::List::fromMimeData\s*\(\s*(\w+)\s*\)/) {
0049            my $var = $1;
0050            s/KUrl::List::fromMimeData\s*\(\s*$var\s*\)/$var\-\>urls()/;
0051         }
0052         if (/KUrl::List::canDecode\s*\(\s*(\w+)\s*\)/) {
0053            my $var = $1;
0054            s/KUrl::List::canDecode\s*\(\s*$var\s*\)/$var\-\>hasUrls()/;
0055         }
0056 
0057 
0058         # Detect variables being declared as KUrl
0059         if (/const KUrl\s*&\s*(\w+)/ || /^\s*KUrl\s+(\w+)\s*[=\;]/ || /^\s*KUrl\s+(\w+)\s*\(/) {
0060             $urls{$1} = 1;
0061             print STDERR "found KUrl var: $1\n";
0062             s/const KUrl\s*&\s*/const QUrl &/;
0063             s/KUrl (\w+)\;/QUrl $1\;/;
0064             s/KUrl (\w+)\s*=/QUrl $1 =/;
0065         }
0066         # Detect variables being declared as QUrl (for copying into KUrls, below)
0067         if (/const QUrl\s*&\s*(\w+)/ || /^\s*QUrl\s+(\w+)\s*(?:=|;)/ || /^\s*QUrl\s+(\w+)\s*\(/) {
0068             #print STDERR "found QUrl var: $1\n";
0069             $urls{$1} = 2;
0070         }
0071 
0072         # Do not port KUrl(QString) automatically, that's impossible (need to find out if the string is a path or a URL...)
0073         # Except when it's clear :)
0074         if (my ($var, $value) = /KUrl (\w+)\s*\(\s*(\"[^\"]*\")\s*\)/) {
0075             if ($value =~ /:\//) { # full URL -> clear
0076                 s/KUrl $var/QUrl $var/;
0077             }
0078         }
0079         if (my ($value) = /KUrl\s*\(\s*(\"[^\"]*\")\s*\)/) { # anonymous var
0080             if ($value =~ /:\//) { # full URL -> clear
0081                 s/KUrl\s*\(\s*\Q$value\E\s*\)/QUrl($value)/;
0082             }
0083         }
0084         if (my ($var, $value) = /KUrl (\w+)\s*\(\s*(\w+)\s*\)/) {
0085             if (defined $urls{$value}) { # copy of another URL -> clear
0086                 s/KUrl $var/QUrl $var/;
0087             }
0088         }
0089         if (/(\w+)\.pass\(\)/ && defined $urls{$1}) {
0090             my $url = $1;
0091             s/$url\.pass\(\)/$url\.password()/g;
0092         }
0093         if (/(\w+)\.setPass\b/ && defined $urls{$1}) {
0094             my $url = $1;
0095             s/$url\.setPass\b/$url\.setPassword/g;
0096         }
0097 
0098         if (/(\w+)\.protocol\(\)/ && defined $urls{$1}) {
0099             my $url = $1;
0100             s/$url\.protocol\(\)/$url\.scheme()/g;
0101         }
0102         if (/(\w+)\.setProtocol\(/ && defined $urls{$1}) {
0103             my $url = $1;
0104             s/$url\.setProtocol\(/$url\.setScheme(/g;
0105         }
0106         if (/(\w+)\.user\(\)/ && defined $urls{$1}) {
0107             my $url = $1;
0108             s/$url\.user\(\)/$url\.userName()/g;
0109         }
0110         if (/(\w+)\.setUser\b/ && defined $urls{$1}) {
0111             my $url = $1;
0112             s/$url\.setUser\b/$url\.setUserName/g;
0113         }
0114         if (/(\w+)\.setRef\b/ && defined $urls{$1}) {
0115             my $url = $1;
0116             s/$url\.setRef\b/$url\.setFragment/g;
0117         }
0118         if (/(\w+)\.htmlRef\(\)/ && defined $urls{$1}) {
0119             my $url = $1;
0120             s/$url\.htmlRef\(\)/$url\.fragment(QUrl::FullyDecoded)/g;
0121         }
0122         if (/(\w+)\.hasHTMLRef\(\)/ && defined $urls{$1}) {
0123             my $url = $1;
0124             s/$url\.hasHTMLRef\(\)/$url\.hasFragment()/g;
0125         }
0126 
0127         if (/(\w+)\.hasRef\(\)/ && defined $urls{$1}) {
0128             my $url = $1;
0129             s/$url\.hasRef\(\)/$url\.hasFragment()/g;
0130         }
0131 
0132         # url.adjustPath(KUrl::RemoveTrailingSlash) => url = url.adjusted(QUrl::StripTrailingSlash);
0133         if (/(\w*).adjustPath\(\s*KUrl::RemoveTrailingSlash\s*\)/) {
0134             my $urlvar = $1;
0135             s/$urlvar\.adjustPath\(\s*KUrl::RemoveTrailingSlash\s*\)/$urlvar = $urlvar\.adjusted(QUrl::StripTrailingSlash)/;
0136         }
0137         # url.directory()
0138         if (/(\w+)\.directory\(\)/ && defined $urls{$1}) {
0139             my $url = $1;
0140             s/$url\.directory\(\)/$url\.adjusted(QUrl::RemoveFilename|QUrl::StripTrailingSlash).path()/g;
0141         }
0142         # url.url(KUrl::RemoveTrailingSlash)
0143         if (/\.url\([KQ]Url::RemoveTrailingSlash\)/) {
0144             s/\.url\([KQ]Url::RemoveTrailingSlash\)/\.adjusted(QUrl::StripTrailingSlash).toString()/g;
0145         }
0146         # url.path(KUrl::RemoveTrailingSlash)
0147         if (/\.path\(KUrl::RemoveTrailingSlash\)/) {
0148             s/\.path\(KUrl::RemoveTrailingSlash\)/\.adjusted(QUrl::StripTrailingSlash).path()/g;
0149         }
0150         # url.toLocalFile(KUrl::RemoveTrailingSlash)
0151         if (/\.toLocalFile\(KUrl::RemoveTrailingSlash\)/) {
0152             s/\.toLocalFile\(KUrl::RemoveTrailingSlash\)/\.adjusted(QUrl::StripTrailingSlash).toLocalFile()/g;
0153         }
0154         # url.adjustPath(KUrl::RemoveTrailingSlash)
0155         if (/(\w+)\.adjustPath\(KUrl::RemoveTrailingSlash\)/ && defined $urls{$1}) {
0156             my $url = $1;
0157             s/$url\.adjustPath\(KUrl::RemoveTrailingSlash\)/$url = $url\.adjusted(QUrl::StripTrailingSlash)/g;
0158         }
0159 
0160         #url.setFileName(...)
0161        my $regexpRange = qr/
0162            ^(\s*)                        # (1) Indentation, possibly "Classname *" (the ? means non-greedy)
0163            (\w+)                         # (2) variable name
0164            \.setFileName\s*\((.*)\)        # (3) argument
0165            (.*)$                         # (4) afterreg
0166            /x; # /x Enables extended whitespace mode
0167         if (my ($indent, $url, $arg, $afterreg) = $_ =~ $regexpRange) {
0168            if (defined $urls{$url}) {
0169               $_ = $indent . "$url = $url.adjusted(QUrl::RemoveFilename);\n";
0170               $_ .= $indent . "$url.setPath($url.path() + $arg);\n";
0171            }
0172         }
0173 
0174 
0175         #u.queryItem(QLatin1String("x-allow-unencrypted"))
0176         #=> QUrlQuery(url).queryItemValue
0177         if (/(\w+)\.queryItem\b/ && defined $urls{$1}) {
0178            my $url = $1;
0179            s/$url\.queryItem\b/QUrlQuery($url).queryItemValue/;
0180         }
0181 
0182         # url.addPath(path)
0183         my $regexpAddPath = qr/
0184           ^(\s*)           # (1) Indentation
0185           (\w+)\.addPath   # (2) url
0186           ${functionUtilkde::paren_begin}3${functionUtilkde::paren_end}  # (3) path
0187           /x; # /x Enables extended whitespace mode
0188         if (my ($indent, $url, $path) = $_ =~ $regexpAddPath ) {
0189             if (defined $urls{$url}) {
0190                 $_ = $indent . "$url = $url" . ".adjusted(QUrl::StripTrailingSlash);\n" . $indent . "$url.setPath($url.path() + '\/' + $path);\n";
0191                 #s/$url\.addPath\(\s*$path\s*\)\;/$url = $url\.adjusted(QUrl::StripTrailingSlash)\;\n$indent$url.setPath($url.path() + '\/' + $path)\;/;
0192             }
0193         }
0194 
0195         if ( /(\w+)\.prettyUrl\(\)/ && defined $urls{$1}) {
0196            my $url = $1;
0197            s/$url\.prettyUrl\b/$url\.toDisplayString/;
0198         }        
0199         s/KUrl::List\b/QList<QUrl>/g;
0200         s,\bKUrl\b,QUrl,g;
0201 
0202         $modified ||= $orig ne $_;
0203         $_;
0204     } <$FILE>;
0205 
0206     if ($modified) {
0207         open (my $OUT, ">", $file);
0208         print $OUT @l;
0209         close ($OUT);
0210     }
0211 }
0212 
0213 functionUtilkde::diffFile( "@ARGV" );