#!/usr/bin/perl -w

# Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1.  Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer. 
# 2.  Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution. 
# 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
#     its contributors may be used to endorse or promote products derived
#     from this software without specific prior written permission. 
#
# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# Script to do a rename in JavaScriptCore, WebCore, and WebKit.

use strict;
use FindBin;
use lib $FindBin::Bin;
use webkitdirs;
use File::Find;

setConfiguration();
chdirWebKit();

my %words;

# find all files we want to process

my @paths;
find(\&wanted, "JavaScriptCore");
find(\&wanted, "JavaScriptGlue");
find(\&wanted, "WebCore");
find(\&wanted, "WebKit");

sub wanted
{
    my $file = $_;

    if ($file eq "icu") {
        $File::Find::prune = 1;
        return;
    }

    if ($file =~ /^\../) {
        $File::Find::prune = 1;
        return;
    }

    return if $file =~ /^ChangeLog/;
    return if -d $file;

    push @paths, $File::Find::name;
}

my %renames = (
);

my %renamesContemplatedForTheFuture = (
    "DOMObject" => "JSDOMObject",

    "runtimeObjectGetter" => "pluginElementGetter",
    "runtimeObjectPropertyGetter" => "pluginElementPropertyGetter",
    "runtimeObjectCustomGetOwnPropertySlot" => "pluginElementCustomGetOwnPropertySlot",
    "runtimeObjectCustomPut" => "pluginElementCustomPut",
    "runtimeObjectImplementsCall" => "pluginElementImplementsCall",
    "runtimeObjectCallAsFunction" => "pluginElementCallAsFunction",

    "CLONE_CONTENTS" => "Clone",
    "DELETE_CONTENTS" => "Delete",
    "EXTRACT_CONTENTS" => "Extract",

    "DateInstance" => "JSDate",
    "ErrorInstance" => "JSError",

    "KURL" => "URL",
    "KURLCFNet" => "URLCF",
    "KURLHash" => "URLHash",
    "KURLMac" => "URLMac",
    "KURL_h" => "URL_h",

    "ThreadSafeSharedBase" => "ThreadSafeRefCountedBase",
    "ThreadSafeShared" => "ThreadSafeRefCounted",
    "TreeShared" => "TreeRefCounted",

    "StringImpl" => "SharedString",

    "RenderView" => "RenderViewport",

    "ObjcFallbackObjectImp" => "ObjCFallbackObject",
    "RuntimeObjectImp" => "ForeignObject",

    "runtime_array" => "BridgedArray",
    "runtime_method" => "BridgedFunction",
    "runtime_object" => "BridgedObject",
    "objc_runtime" => "ObjCBridge",

    "equalIgnoringCase" => "equalFoldingCase",

    "FTPDirectoryTokenizer" => "FTPDirectoryDocumentBuilder",
    "HTMLTokenizer" => "HTMLDocumentBuilder",
    "ImageTokenizer" => "ImageDocumentBuilder",
    "PluginTokenizer" => "PluginDocumentBuilder",
    "TextTokenizer" => "TextDocumentBuilder",
    "Tokenizer" => "DocumentBuilder",
    "Tokenizer_h" => "DocumentBuilder_h",
    "XMLTokenizer" => "XMLDocumentBuilder",
    "isHTMLTokenizer" => "isHTMLDocumentBuilder",
    "m_tokenizer" => "m_builder",
    "createTokenizer" => "createBuilder",
    "tokenizerProcessedData" => "documentBuilderProcessedData",

    "WTF_UNICODE_H" => "Unicode_h",
    "WTF_UNICODE_ICU_H" => "UnicodeICU_h",
    "WTF_UNICODE_QT4_H" => "UnicodeQt4_h",
    "UnicodeIcu" => "UnicodeICU",

    "m_invertibleCTM" => "m_transformIsInvertible",

    "NativeFunctionWrapper_h" => "JSHostFunction_h",
    "NativeFunctionWrapper" => "JSHostFunction",
    "nativeFunctionThunk" => "hostFunctionThunk",
    "nativeFunction" => "hostFunction",
    "NativeFunction" => "HostFunction",
);

# rename files

my %newFile;
for my $file (sort @paths) {
    my $f = $file;
    $f = "$1$renames{$2}$3" if $f =~ /^(.*\/)(\w+)(\.\w+)$/ && $renames{$2};
    if ($f ne $file) {
        $newFile{$file} = $f;
    }
}

for my $file (sort @paths) {
    if ($newFile{$file}) {
        my $newFile = $newFile{$file};
        print "Renaming $file to $newFile\n";
        system "svn move $file $newFile";
    }
}

# change all file contents

for my $file (sort @paths) {
    $file = $newFile{$file} if $newFile{$file};
    my $contents;
    {
        local $/;
        open FILE, $file or die;
        $contents = <FILE>;
        close FILE;
    }
    my $newContents = $contents;

    for my $from (keys %renames) {
        $newContents =~ s/\b$from(?!["\w])/$renames{$from}/g; # this " unconfuses Xcode syntax highlighting
    }

    if ($newContents ne $contents) {
        open FILE, ">", $file or die;
        print FILE $newContents;
        close FILE;
    }
}
