Warning, file /sdk/kde-dev-scripts/kf5/convert-kurl.pl was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
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" );